C# TreeView NodeMouseclick 或 Click 函数显示先前选择的内容

问题描述 投票:0回答:1

嗨,我面临一个特殊的问题。我正在使用 Windows 窗体(.NET Framework),并使用数据库中的示例列表创建了一个 TreeView。我想显示用户所选节点的详细信息。但是,当我单击“子财务”节点时,消息框显示先前选择的“库存”而不是“子财务”,然后将“父值”文本框也更新为“库存”。我正在分享我的代码和正在发生的事情的图像。 我已经尝试过单击/鼠标单击,然后尝试了treenodemouseclickeventargs。有人可以帮助我吗?我不确定我的代码中是否有需要处理的内容。

private void Form1_load(object sender, EventArgs e)
{
    SqlConnection conn = new SqlConnection(@"Server=localhost\SQLEXPRESS;Database=sample;Trusted_Connection=True;");
    String Sequel = "SELECT MAINMNU,MENUPARVAL,STATUS FROM [sample].[accounts].[MNUPARENT]";
    SqlDataAdapter da = new SqlDataAdapter(Sequel, conn);
    DataTable dt = new DataTable();
    da.Fill(dt);
    foreach (DataRow dr in dt.Rows)
    {
        parentNode = treeView1.Nodes.Add(dr["MAINMNU"].ToString());
        PopulateTreeView(Convert.ToInt32(dr["MENUPARVAL"].ToString()), parentNode);

    }
    treeView1.ExpandAll();
}
private void PopulateTreeView(int parentId, TreeNode parentNode)
{
    SqlConnection conn = new SqlConnection(@"Server=localhost\SQLEXPRESS;Database=sample;Trusted_Connection=True;");
    String Seqchildc = "SELECT MENUPARVAL,FRM_NAME,MNUSUBMENU FROM sample.accounts.MNUSUBMENU WHERE MENUPARVAL=" + parentId + "";
    SqlDataAdapter dachildmnuc = new SqlDataAdapter(Seqchildc, conn);
    DataTable dtchildc = new DataTable();
    dachildmnuc.Fill(dtchildc);
    TreeNode childNode;
    foreach (DataRow dr in dtchildc.Rows)
    {
        if (parentNode == null)
            childNode = treeView1.Nodes.Add(dr["FRM_NAME"].ToString());
        else
            childNode = parentNode.Nodes.Add(dr["FRM_NAME"].ToString());
        PopulateTreeView(Convert.ToInt32(dr["MNUSUBMENU"].ToString()), childNode);
        
    }
}
private void treeView1_MouseSingleClick(object sender, TreeNodeMouseClickEventArgs e)
{
    var menuItem = treeView1.SelectedNode.Text;
    if (menuItem != null)
    {
        MessageBox.Show(menuItem);
        textBox_parentVal.Text = menuItem;
    }
}

Screenshot of clicking Child Finance but MessageBox shows previous selected

c# visual-studio treeview
1个回答
0
投票

经过我的测试,您的问题出在treeView1_MouseSingleClick事件处理程序上。您使用了treeView1.SelectedNode.Text。在某些情况下,SelectedNode 在显示先前选定的值时可能会滞后。因此,当你点击新节点时,SelectedNode还没有更新为你当前点击的节点。

您可以尝试将 var menuItem = treeView1.SelectedNode.Text; 更改为 var menuItem = e.Node.Text;。 e是TreeNodeMouseClickEventArgs类型的对象,直接指向当前点击的节点。

这样,menuItem会直接获取你点击的节点的文本,而不会受到更新SelectedNode延迟的影响。

© www.soinside.com 2019 - 2024. All rights reserved.