我在Windows窗体中使用Treeview但遇到了一些问题。扩展和折叠时我的节点选择在Treeview底部发生变化。我正在使用afterselect和MosueDown活动。我的问题是我必须在我的应用程序中处理AfterSelect和MouseDown事件,因为我正在使用右键单击上下文菜单。下面是我尝试使用的示例代码。有没有办法或建议来解决这个问题?
private void trView_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
trView.SelectedNode = trView.GetNodeAt(e.X, e.Y);
}
//trView.SelectedNode.EnsureVisible(); //tried this as well
trView.SelectedNode.Toggle(); // on this toggle selection changes butonly at the bottom (more specifically for last 3 nodes)
}
private void trView_AfterSelect(object sender, TreeViewEventArgs e)
{
// Code to add child nodes to a selection.
}
在上面的图片中,当我选择Project Beyond Node时,UAT数据被选中。这只发生在最后3个节点中。我被卡住了。请帮忙。
答案 0 :(得分:1)
您可以使用以下任一选项:
使用MouseDown
事件,在使用SelectedNode
设置Toggle
,BeginInvoke
之后:
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);
treeView1.BeginInvoke(new Action(() => { treeView1.SelectedNode.Toggle(); }));
}
}
使用NodeMouseClick
事件:
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);
treeView1.SelectedNode.Toggle();
}
}
注意强>
通常,点击+/-
后应执行切换操作,因为选择操作与单击+/-
不同。但您可以简单地根据var node = treeView1.GetNodeAt(e.X, e.Y)
和var hti = treeView1.HitTest(e.Location);
以及e.Button
混合使用某些条件,以满足鼠标按下的任何要求。
例如,在下面的代码中,左键单击和右键单击以相同的方式工作,它们都选择节点并且都切换所选节点。
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
var node = treeView1.GetNodeAt(e.X, e.Y);
var hti = treeView1.HitTest(e.Location);
if (node == null)
return;
treeView1.BeginInvoke(new Action(() => treeView1.SelectedNode = node));
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
node.Toggle();
}
else if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
if (hti.Location != TreeViewHitTestLocations.PlusMinus)
node.Toggle();
}
}