【问题标题】:TreeView Node Selection树视图节点选择
【发布时间】:2014-08-12 15:14:57
【问题描述】:

我在选择节点时遇到问题。这是我想要实现的目标:

+ [ ] Directory1
- [x] Files
       [ ] File1
       [ ] File2
       [ ] File3
       [ ] File4
       [ ] File5
       [ ] File6

当我单击文件(启用复选框)时,它仅选择文件夹节点的文件,但我希望它在单个目录选择时检查并选择整个文件(即通过单击文件,它选择其中包含的所有文件) .尽管该目录中有数千个文件,因此无法手动检查每个文件。

我想我在这里遗漏了一些东西。

private void SetCheck(TreeNode node, bool check)
{
    foreach (TreeNode n in node.Nodes)
    {
        n.Checked = check;

        if (n.Nodes.Count != 0)
        {
            SetCheck(n, check);
        }
    }
}

和/或

private void GetCheckedFiles(TreeNode node, List<string> fileNames)
{
    if (node.Nodes.Count == 0)
    {
        if (node.Checked)
        {
            fileNames.Add(node.FullPath);
        }
    }
    else
    {
        foreach (TreeNode n in node.Nodes)
        {
            GetCheckedFiles(n, fileNames);
        }
    }
}

【问题讨论】:

  • 不是设置子checkBoxes吗?这是 WinForms 还是 WPF?
  • 确定您忽略了某些内容,将代码发布到调用此代码的事件处理程序中。设置 TreeNode.Checked 属性将导致事件再次触发,从而导致各种不当行为。您通常需要一个 bool 字段来防止它再次调用 SetCheck()。
  • @RodrigoSilva:是的,它是 WinForms。
  • @HansPassant:您能告诉我如何处理代码吗?我没有太多编程经验。因为我是新手。这就是为什么在获得理论观点时会遇到问题。
  • 我注意到您忘记发布事件处理程序的代码。这不是理论上的。

标签: c# winforms file treeview selection


【解决方案1】:

假设您的代码从 AfterCheck 事件运行,您将不得不删除处理程序或使用变量来防止每次受 SetCheck 例程影响的每个节点的复选标记发生更改时都运行相同的代码。

例子:

private bool ignoreCheckEvent = false;

void treeView1_AfterCheck(object sender, TreeViewEventArgs e) {
  if (!ignoreCheckEvent) {
    ignoreCheckEvent = true;
    SetCheck(e.Node, e.Node.Checked);
    ignoreCheckEvent = false;  
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多