c# - TreeView 检测节点选择,但在选中或取消选中时不检测
问题描述
我有一个使用AfterSelect事件触发的事件,它工作得很好,但是如果用户选中或取消选中此或树中任何节点的复选框,我不希望此事件触发。或者,该事件可以触发,但是我需要知道事件内部是否由于选中或取消选中复选框而触发它。我尝试使用 NodeMouseClick,但得到了相同的不需要的结果,我还尝试使用 BeforeCheck 删除事件处理程序并使用 AfterCheck 将其添加回来,如下所示:
private void MyTree_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
this.MyTree.AfterSelect -= new System.Windows.Forms.TreeViewEventHandler(this.MyTree_AfterSelect);
}
private void MyTree_AfterCheck(object sender, TreeViewEventArgs e)
{
this.MyTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.MyTree_AfterSelect);
}
private void MyTree_AfterSelect(object sender, TreeViewEventArgs e)
{
ShowMyInfo(e.Node);
}
但是 AfterSelect 事件仍然会触发。
我不能依赖,AfterCheck
因为如果您只是选择节点,它就不会触发。我也不能依赖检查 if e.Node.Selected == true
,因为节点可能已经被检查过,如果节点实际上是故意选择的,我希望事件触发。
有没有我可以使用的事件处理程序,它只会在节点被选中,而不是被选中或未被选中时触发,或者我可以通过任何方式检测刚刚选中的节点是否已被选中或未选中。
将 Visual Studio 2019 与 C# WinForms .NET Framework 应用程序结合使用。
解决方案
正如@Jimi 和@dr.null 所指出的,我毕竟使用了正确的事件。AfterSelect 不会因为您选中或取消选中复选框而触发。
我遇到的问题是我有代码,如果你右键单击它会选择一个节点(右键单击不会自动选择一个节点)。
旧代码:
private void MyTree_MouseDown(object sender, MouseEventArgs e)
{
MyTree.SelectedNode = MyTree.GetNodeAt(e.X, e.Y);
}
新代码:
private void MyTree_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right) MyTree.SelectedNode = MyTree.GetNodeAt(e.X, e.Y);
}
我无意中触发了自己的事件,因为我没有检查在 MouseDown 事件上单击了哪个鼠标按钮。感谢您的帮助!
推荐阅读
- python - 如何在 Python 中比较它们各自列表中相同索引中的 2 个列表中的元素?
- kotlin - 在类/接口中创建扩展函数作为方法的用户案例是什么?
- python - 有没有办法只使用opencv来检测自主着陆的着陆区域?
- batch-file - 如何正确实现此批处理文件?
- pandas - 如何根据多个条件正确删除行
- python - 如何仅检测“旋转”图像?(未翻转)
- python-3.x - 如何在 Python3 中将 UTF-8 CSV 写入 BytesIO?
- android - Android @Compose 如何处理 Android 中的屏幕大小和方向
- swift - 以编程方式将资产添加到 iCloud 共享相册
- sql - 如何根据 PostgreSQL 中 JSON 中的另一个字符串从 JSON 中查询一个字符串?