c# - 如何防止事件导致其自身的事件在 C# 中触发?

标签 c# .net winforms events treeview

我有一个带复选框的 TreeView ,我有以下“AfterCheck”事件的处理程序:

private void trvAvailableFiles_AfterCheck(object sender, TreeViewEventArgs e)
{
    if (!_isCheckingInProgress)
    {
        trvAvailableFiles.BeginUpdate();

        var nodePath = e.Node.Tag.ToString();
        bool isChecked = e.Node.Checked;
        e.Node.Nodes.Clear();

        try
        {
            _fileTreeLogic.GetChildNodes(e.Node, true);
            e.Node.ExpandAll();

            _isCheckingInProgress = true;
            SetChildrenCheckState(e.Node, isChecked);
            _isCheckingInProgress = false;

        }
        finally
        {
            trvAvailableFiles.EndUpdate();
        }
    }
}

如果您仔细观察,您会发现我正在检查“_isCheckingInProgress”。如果不是,则我继续展开所有节点并调用 SetChildrenCheckState() 方法。我遇到的问题是 SetChildrenCheckState() 随后会导致每个子节点都为自己的节点触发 AfterCheck 事件。

我的问题是,是否有更简洁的方法允许触发第一个 AfterCheck 事件而不触发后续事件?我必须有一个实例 bool 变量来检查和设置,这似乎有点老套。

最佳答案

使用:if(e.Action != TreeViewAction.Unknown) 而不是 if (!_isCheckingInProgress)。参见 TreeViewAction .

当用户使用键盘或鼠标选中复选框时,e.Action 将为TreeViewAction.ByKeyboardTreeViewAction.ByMouse

MSDN 提供此作为 TreeView.AfterCheck Event 的示例代码.

编辑 1:显然,如果您在代码中自己设置复选框,请将事件处理程序中的代码移动到一个新函数,并让设置复选框的代码直接调用它。此解决方案的要点是让您使用事件处理程序处理用户输入,而无需在您通过代码自行设置复选框时触发这些事件。

编辑 2:请参阅 Spencer 的回答以了解我在编辑 1 中的评论

关于c# - 如何防止事件导致其自身的事件在 C# 中触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5012716/

相关文章:

c# - 是否可以使用查询参数来填充 IN 关键字

.net - 将翻译后的 resx 文件放在 Visual Studio 中的不同文件夹中?

c#, Textbox.Text 编码

c# - form1.designer.cs 和 form1.resx 的目的

c# - Resharper:vars

c# - SqlCommand 如果存在 - 更新,如果不存在 - 插入

C# UI 自动化

c# - 将 .NET DateTime.Ticks 属性转换为 Objective-C 中的日期

c# - .NET - 有什么方法可以创建非静态线程方法吗?

c# - 在 C# 中转换 "div"