将树视图中的节点设置为以编程方式检查 returns System.StackOverflowException
Setting a node in a treeview to checked programmatically returns System.StackOverflowException
我试图不允许在树视图中检查多个节点。
我找到了 before_check
事件处理程序,这样我就可以在用户检查的节点被选中之前取消选中所有其他节点。
我已经尝试在控制台写入节点的名称,只是为了查看我是否拥有正确的节点层,一切正常。
private void TreeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
foreach (TreeNode node in treeView1.nodes)
{
if (treeView1.Nodes != null)
{
node.Checked = false;
//Console.WriteLine(node.Text);
}
}
}
问题出在我试图将节点设置为选中时。每当我按下复选框时,它只会给出 System.WhosebugException
。
使用 TreeViewCancelEventArgs.Action
值仅在用户 activity 触发事件时清除复选框。
使用递归方法枚举节点。不要取消选中要检查的一个节点。
private void UncheckNodesExcept(TreeNode root, TreeNode except)
{
// Clear checkbox unless it is the one we don't want to clear
if(root != except)
{
root.Checked = false;
}
// Recurse over childs
foreach(TreeNode child in root.Nodes)
{
UncheckNodesExcept(child, except);
}
}
private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
TreeView treeView = sender as TreeView;
// Only if action was triggered by user
if (e.Action == TreeViewAction.ByKeyboard || e.Action == TreeViewAction.ByMouse)
{
foreach(TreeNode node in treeView.Nodes)
{
UncheckNodesExcept(node, e.Node);
}
}
}
我试图不允许在树视图中检查多个节点。
我找到了 before_check
事件处理程序,这样我就可以在用户检查的节点被选中之前取消选中所有其他节点。
我已经尝试在控制台写入节点的名称,只是为了查看我是否拥有正确的节点层,一切正常。
private void TreeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
foreach (TreeNode node in treeView1.nodes)
{
if (treeView1.Nodes != null)
{
node.Checked = false;
//Console.WriteLine(node.Text);
}
}
}
问题出在我试图将节点设置为选中时。每当我按下复选框时,它只会给出 System.WhosebugException
。
使用 TreeViewCancelEventArgs.Action
值仅在用户 activity 触发事件时清除复选框。
使用递归方法枚举节点。不要取消选中要检查的一个节点。
private void UncheckNodesExcept(TreeNode root, TreeNode except)
{
// Clear checkbox unless it is the one we don't want to clear
if(root != except)
{
root.Checked = false;
}
// Recurse over childs
foreach(TreeNode child in root.Nodes)
{
UncheckNodesExcept(child, except);
}
}
private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
TreeView treeView = sender as TreeView;
// Only if action was triggered by user
if (e.Action == TreeViewAction.ByKeyboard || e.Action == TreeViewAction.ByMouse)
{
foreach(TreeNode node in treeView.Nodes)
{
UncheckNodesExcept(node, e.Node);
}
}
}