【问题标题】:How can I get the current node selected in a TreeView control?如何获取 TreeView 控件中选择的当前节点?
【发布时间】:2011-01-03 05:13:24
【问题描述】:

当我使用树视图控件的MouseClick 事件时,总是选择树中的第一个节点。我应该怎么做才能让用户选择当前节点?我正在使用 C#。

这是我目前使用的代码:

private void TVRecorder_MouseClick(object sender, MouseEventArgs e)
{
    TreeNode selectedNode = TVRecorder.HitTest(e.Location).Node;
    if (selectedNode != null)
    {
        if (selectedNode.SelectedImageKey == "Test_Space")
        {
            frmRepository rep = new frmRepository();
            string ssql = string.Empty;
            rep.label1.Text = "Scenario-RepositoryDetails";
            rep.LoadAppSettings();
            SqlConnection con4 = new SqlConnection();

            con4.ConnectionString = "Data Source=" + rep.ScnServer + ";" + "initial catalog=" + rep.ScnDbName + ";" + "User Id=" + rep.ScnUserName + ";" + "Password=" + rep.ScnPwd;
            try
            {
                con4.Open();
            }
            catch
            {
                MessageBox.Show("Connection Failed");
            }
            ssql = "scn_select_testplan_sp";
            SqlCommand cmd = new SqlCommand(ssql, con4);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@testspace_key", SqlDbType.Int);
            cmd.Parameters["@testspace_key"].Value = testspace_key;
            SqlDataReader _datareader = cmd.ExecuteReader();
            try
            {
                while (_datareader.Read())
                {
                    testplan_key = (int)_datareader["testplan_key"];
                    testplan_desc = (string)_datareader["testplan_desc"];
                    //selectedNode.Nodes[0].Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan");
                    TVRecorder.Nodes[0].Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan");
                    TVRecorder.Visible = true;
                    TVRecorder.HideSelection = false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

提前谢谢...

【问题讨论】:

  • WPFWinForms?也放一些代码。
  • 这是一个窗体应用程序......

标签: c# .net winforms treeview treenode


【解决方案1】:

您可以使用TreeView控件暴露的HitTest method结合MouseClick事件发生时鼠标指针的位置(e.Location)来确定哪个节点是单击(因此将在事件结束时显示为选中)。例如:

private void TreeView_MouseClick(object sender, MouseEventArgs e)
{
    // Get the node that was clicked
    TreeNode selectedNode = myTreeView.HitTest(e.Location).Node;

    if (selectedNode != null)
    {
        // ...
        // Do something with the selected node here...
    }
}

请注意,上面的代码会检查以确保selectedNode 不为空,然后再对其进行任何操作。如果用户点击了不是节点的东西,HitTest 方法检索到的selectedNode 对象将是null

它现在可能不适合您,因为您正尝试使用 TreeView 控件的 SelectedNode property。当您的MouseClick 事件处理程序方法中的代码正在运行时,该节点尚未被选中——它只会在代码执行后 被选中。改用上述方法可以让您更直接地到达最终​​将被选中的节点。


编辑以下关于您的更新和评论:

这在我看来是一个简单的修复。问题出现在您的这行代码中:

TVRecorder.Nodes[0].Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan");

以上代码将新节点添加为出现在TreeView 中的第一个节点的子节点。相反,在我看来,您希望将它们添加为所选节点的子节点。您已经确定了所选节点是什么(请参阅上面的答案部分),因此您只需修改代码以将新节点添加为所选节点的子节点,如下所示:

selectedNode.Nodes.Add(Convert.ToString(testplan_key), testplan_desc, "P", "Test_Plan");

请记住,每个节点(TreeNode class 的一个实例)都有一个 Nodes property,它公开了一个 TreeNodeCollection。该集合包含该节点的所有子节点。 MSDN 可能比我更好地解释了这一点:

Nodes 属性可以保存一个 其他TreeNode 对象的集合。 中的每个树节点[s] 集合有一个 Nodes 属性, 可以包含自己的 TreeNodeCollection。这种嵌套 树节点可能难以 导航树结构。这 FullPath 属性使其更容易 确定您在树中的位置。

【讨论】:

  • 感谢 Code Gray... 但我仍然有问题现在我能够获取所选节点但是当我插入子节点时,子节点会插入第一个节点而不是节点中我选择了。这是正在使用的代码....
  • @vikasse:请编辑您的问题以发布您正在使用的代码,而不是将其添加为评论。注释不会得到代码突出显示或换行符!没有人愿意读那本书。 ;-)
  • @vikasse:我已经更新了我的答案。你的代码中所有的 try-catch 异常处理让我的眼睛有点呆滞,但我认为这正是你想要做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2019-12-02
相关资源
最近更新 更多