gpt4 book ai didi

Winforms treeview,递归检查子节点问题

转载 作者:行者123 更新时间:2023-12-02 04:05:56 26 4
gpt4 key购买 nike

以下代码直接取自 Microsoft http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.aftercheck%28VS.80%29.aspx .

  // Updates all child tree nodes recursively.
private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
{
foreach (TreeNode node in treeNode.Nodes)
{
node.Checked = nodeChecked;
if (node.Nodes.Count > 0)
{
// If the current node has child nodes, call the CheckAllChildsNodes method recursively.
this.CheckAllChildNodes(node, nodeChecked);
}
}
}

// NOTE This code can be added to the BeforeCheck event handler instead of the AfterCheck event.
// After a tree node's Checked property is changed, all its child nodes are updated to the same value.
private void node_AfterCheck(object sender, TreeViewEventArgs e)
{
// The code only executes if the user caused the checked state to change.
if (e.Action != TreeViewAction.Unknown)
{
if (e.Node.Nodes.Count > 0)
{
/* Calls the CheckAllChildNodes method, passing in the current
Checked value of the TreeNode whose checked state changed. */
this.CheckAllChildNodes(e.Node, e.Node.Checked);
}
}
}

您将其放入包含 TreeView 的表单中,并在 TreeView AfterCheck 事件(惊喜,惊喜)上调用 node_AfterCheck。然后,它递归地检查或取消选中 TreeView 上的子节点。

但是,如果您实际尝试,并足够快地多次单击同一个 TreeView 复选框,则子节点最终的检查与父节点不同步。您可能需要几个级别的子级(总共可能有 100 个子级),以便 UI 更新足够慢才能注意到这种情况的发生。

我已经尝试了一些方法(例如在node_AfterCheck开始时禁用treeview控件并在最后重新启用),但不同步问题仍然发生。

有什么想法吗?

最佳答案

.NET TreeView 类对 native Windows 控件进行了大量自定义鼠标处理,以便合成 Before/After 事件。不幸的是,他们并没有完全正确地理解。当您开始快速单击时,您将生成双击消息。 native 控件通过切换项目的选中状态来响应双击,而不告诉 .NET 包装器。您不会收到 Before/AfterCheck 事件。

这是一个错误,但他们不会修复它。解决方法并不困难,您需要防止 native 控件看到双击事件。将新类添加到您的项目中并粘贴下面所示的代码。编译。从工具箱顶部删除新控件,替换现有控件。

using System;
using System.Windows.Forms;

class MyTreeView : TreeView {
protected override void WndProc(ref Message m) {
// Filter WM_LBUTTONDBLCLK
if (m.Msg != 0x203) base.WndProc(ref m);
}
}

关于Winforms treeview,递归检查子节点问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3174412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com