如何使Treeview的CheckBox失效

时间:2016-02-08 07:14:18

标签: c# .net winforms checkbox treeview

我有两个treeview,其中有一些节点,使用所需的命令后面有复选框。现在我想让一些节点变灰/变形。为此,我从第一个树视图中选择一个节点,然后在另一个树视图中从node.Text与其文本不相等的所有节点都是灰色的。我是通过以下功能完成的:

public void deactive_checkboxs(object sender, EventArgs e)
{
    TreeNodeCollection nodes_checked1 = treeView1.Nodes[0].LastNode.Nodes;
    TreeNodeCollection nodes_checked2 = treeView2.Nodes[0].LastNode.Nodes;

    foreach (TreeNode node1 in nodes_checked1)
    {
        if (node1.Checked)
        {
            foreach (TreeNode node2 in nodes_checked2)
            {
                if (node1.Text.Equals(node2.Text))
                {
                    node2.Checked = false;
                }
                else
                {
                    node2.Checked = false;
                }
             }
         }
    }
}

当然这不是灰色节点而是删除节点后面的复选框(如果你让我知道制作灰色方法,我会非常感激)。

现在我不知道我应该把这个函数放在哪里才能对代码产生影响。有人帮帮我吗?

1 个答案:

答案 0 :(得分:1)

仅通过设置属性就无法做到这一点。

您既不能停用单个Node也不能删除其CheckBox

以下是您可以做的事情:

  • 您可以单独更改每个ForeColor的{​​{1}}
  • 您可以阻止单独更改任何Node的{​​{1}}状态

以下是一个例子:

enter image description here

Checked

启用/禁用Node最佳使用功能:

    treeView1.CheckBoxes = true;
    TreeNode tn = new TreeNode("Node 1");
    TreeNode tn1 = new TreeNode("Node 11");
    TreeNode tn2 = new TreeNode("Node 12");
    tn1.Checked = true;
    tn2.Checked = true;
    tn.Nodes.Add(tn1);
    tn.Nodes.Add(tn2);
    treeView1.Nodes.Add(tn);

    // gray text:
    tn2.ForeColor = Color.Gray;

    // mark one node somehow:
    tn2.Tag = "X";
    // cancel changes for marked node:
    treeView1.BeforeCheck += (s, e) 
        => { if (e.Node.Tag != null && e.Node.Tag.ToString() == "X") e.Cancel = true; };

要禁用Node 外观,您必须自己所有者绘制节点。这是相当多的额外代码..

enter image description here

首先做一些准备工作:

void SetNode(TreeNode node, bool enabled)
{
    node.ForeColor = enabled ? SystemColors.ControlText : Color.Gray;
    node.Tag = enabled ? null : "X";
}

现在实际绘制节点:

CheckBox