选中或取消选中所有TreeViewItem子项

时间:2010-07-20 12:49:14

标签: .net winforms treeview

我的项目是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;
  }
}

然而,当快速点击父母时,这很奇怪。我可以通过快速检查和取消选中父级来轻松地重现这一点,以便在父项已被取消选中时检查子节点。

如何更正确地做到这一点?

3 个答案:

答案 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)

快速单击时,双击事件将触发而不是单击。单击行为是更改已检查状态的行为。如果您已经做了一些事情来覆盖正常的双击行为,请确保在子节点上考虑到这一点。