【问题标题】:Disable certain nodes of a tree control禁用树控件的某些节点
【发布时间】:2010-02-09 18:10:07
【问题描述】:

您好,我有一个带有复选框的 treeView 控件:

复选框 LEVEL1

  checkbox Child1
  checkbox Child2

复选框 LEVEL2

  checkbox Child1

我不允许选中和取消选中 Level 1 的 Child2 和 Level 2 的 Child 1?

这可能在树视图控件中吗?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    问题是,TreeNode 没有启用状态,也没有您可以询问的任何事件。因此,要模拟启用状态,您可以使用 Tag 属性并在创建每个节点时在其中保存一个布尔值。

    然后您将一个事件添加到 TreeView.BeforeCheck 并以某种方式实现:

    void TreeView_BeforeCheck(object sender, TreeViewCancelEventArgs e)
    {
        var IsReadOnly = e.Node.Tag as bool?;
    
        if (IsReadOnly != null)
        {
            e.Cancel = IsReadOnly.Value;
        }
    }
    

    【讨论】:

    • 是的,BeforeCheck。逻辑可能不需要Tag。
    • 上述逻辑确实不需要Tag。但是为了在每个 BeforeCheck 事件中让它更简单(更快),我会确定一个节点在创建节点时是否可检查,然后只需在 BeforeCheck 处检查结果(如果这不可能考虑另一个缓存解决方案)跨度>
    【解决方案2】:

    据我所知,这是不可能的。但你可以自己模仿:

    将节点颜色改为灰色:

    treeControl.Nodes[0].ForeColor = Color.Gray;
    

    并捕捉点击事件:

    private void treeControl_AfterCheck(TreeControl tc,
                                                NodeEventArgs e)
    {
      if(e.Node.ForeColor == Color.Gray)
        e.Node.Checked = !e.Node.Checked;
    }
    

    【讨论】:

    • 我认为这不是一个很好的方法。为什么要依赖颜色?
    • 好吧,我想这是我会遵循的方法。确实是个好建议!谢谢卡拉。 Salvo,我不会依赖颜色......会检查另一个变量!感谢您的解决方法。
    • 这只是一般的想法。您可以使用 node.Tag 或保留禁用节点的列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多