我有一个带复选框的 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.ByKeyboard
或TreeViewAction.ByMouse
。
MSDN 提供此作为 TreeView.AfterCheck Event 的示例代码.
编辑 1:显然,如果您在代码中自己设置复选框,请将事件处理程序中的代码移动到一个新函数,并让设置复选框的代码直接调用它。此解决方案的要点是让您使用事件处理程序处理用户输入,而无需在您通过代码自行设置复选框时触发这些事件。
编辑 2:请参阅 Spencer 的回答以了解我在编辑 1 中的评论
关于c# - 如何防止事件导致其自身的事件在 C# 中触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5012716/