3

当我使用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;
            }

        }

提前致谢...

4

1 回答 1

5

您可以使用控件公开的HitTest方法以及事件发生TreeView时鼠标指针的位置( ) 来确定单击了哪个节点(因此在事件结束时将显示为选中状态)。例如:MouseClicke.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请注意,上面的代码在对其进行任何其他操作之前检查以确保它不为空。如果用户单击了不是节点的东西,则selectedNode该方法检索到的对象HitTest将是null.

它现在可能不适合您,因为您正在尝试使用控件的SelectedNode属性TreeView当您的事件处理程序方法中的代码正在运行时,该节点尚未被选中——只有在该代码执行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的一个实例)都有一个Nodes公开TreeNodeCollection. 该集合包含该节点的所有子节点。MSDN 可能比我能更好地解释这一点:

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

于 2011-01-03T05:34:13.950 回答