嗨,我面临一个特殊的问题。我正在使用 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;
}
}
经过我的测试,您的问题出在treeView1_MouseSingleClick事件处理程序上。您使用了treeView1.SelectedNode.Text。在某些情况下,SelectedNode 在显示先前选定的值时可能会滞后。因此,当你点击新节点时,SelectedNode还没有更新为你当前点击的节点。
您可以尝试将 var menuItem = treeView1.SelectedNode.Text; 更改为 var menuItem = e.Node.Text;。 e是TreeNodeMouseClickEventArgs类型的对象,直接指向当前点击的节点。
这样,menuItem会直接获取你点击的节点的文本,而不会受到更新SelectedNode延迟的影响。