我的项目是WinForms,C#。
我有一个带有TreeView的表单,CheckBoxes设置为true。有几个根节点,每个节点都有多个子节点。
我希望所有子节点都具有与其父节点相同的选中/未选中状态。我编写了以下事件处理程序:
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
// return in case the event is induced by the code below
if (e.Action == TreeViewAction.Unknown)
{
return;
}
System.Diagnostics.Debug.WriteLine(string.Format("Checked - {0}", e.Node.Checked));
foreach (TreeNode subNode in e.Node.Nodes)
{
subNode.Checked = e.Node.Checked;
}
}
然而,当快速点击父母时,这很奇怪。我可以通过快速检查和取消选中父级来轻松地重现这一点,以便在父项已被取消选中时检查子节点。
如何更正确地做到这一点?
答案 0 :(得分:3)
这是本机TreeView控件的Vista版本引入的错误。它通过自动切换复选框来响应双击。但是没有提出BeforeCheck和AfterCheck事件。 Windows Forms TreeView类包装器未更新以解决此问题。
修复很简单,您需要阻止本机控件看到双击。在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱顶部拖放到表单上,替换现有树视图。
using System;
using System.Windows.Forms;
public class MyTreeView : TreeView {
protected override void WndProc(ref Message m) {
// Suppress WM_LBUTTONDBLCLK
if (m.Msg == 0x203) { m.Result = IntPtr.Zero; }
else base.WndProc(ref m);
}
}
答案 1 :(得分:1)
我们添加一个单击时启动/重置的计时器。如果计时器在500ms后触发,则执行实际的更新代码。
这将解决彼此之后的快速点击。
答案 2 :(得分:0)
快速单击时,双击事件将触发而不是单击。单击行为是更改已检查状态的行为。如果您已经做了一些事情来覆盖正常的双击行为,请确保在子节点上考虑到这一点。