【问题标题】:How to deactiveating Treeview's CheckBox如何停用 Treeview 复选框
【发布时间】:2016-05-17 18:58:32
【问题描述】:

我有两个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;
                }
             }
         }
    }
}

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

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

【问题讨论】:

标签: c# .net winforms checkbox treeview


【解决方案1】:

这不能通过简单地设置属性来实现。

您既不能禁用单个Node,也不能删除它的CheckBox

你可以这样做:

  • 您可以单独更改每个NodeForeColor
  • 您可以阻止单独更改任何NodeChecked 状态

这是一个例子:

    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 最好使用函数:

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

要使CheckBox look 禁用,您必须自己owner-draw 节点。那是相当多的额外代码..

先做几个准备:

    treeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll;

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

    // a small correction;
    treeView1.AfterExpand += (s,e) => {treeView1.Refresh();};

现在开始实际绘制节点:

    treeView1.DrawNode += (s, e)
        =>
        {
            if (e.Node.Tag == null || e.Node.Tag.ToString() != "X")
            { e.DrawDefault = true; return; }

            CheckBoxState cbsChDis = CheckBoxState.CheckedDisabled;
            CheckBoxState cbsUCDis = CheckBoxState.UncheckedDisabled;

            Size glyph = Size.Empty;
            glyph = CheckBoxRenderer.GetGlyphSize(e.Graphics, cbsChDis);

            Rectangle tBounds = e.Node.Bounds;  // the real bounds of the hittest area

            if (e.Node.IsSelected)
            {
                e.Graphics.FillRectangle(SystemBrushes.MenuHighlight, tBounds);
                e.Graphics.DrawString(e.Node.Text , Font, Brushes.White,
                                        tBounds.X , tBounds.Y);
            }
            else
            {
                CheckBoxRenderer.DrawParentBackground(e.Graphics, e.Bounds, this);
                e.Graphics.DrawString(e.Node.Text , Font, Brushes.Black,
                                        tBounds.X , tBounds.Y);
            }

            Point cBoxLocation = new Point(tBounds.Left - glyph.Width , tBounds.Top);
            CheckBoxState bs1 = e.Node.Checked ? cbsChDis : cbsUCDis;
            CheckBoxRenderer.DrawCheckBox(e.Graphics, cBoxLocation, bs1);

        };

【讨论】:

  • 非常感谢您的回答。这是一个伟大的。
  • 如果您有任何问题,请尽管提问! - 如果您对答案感到满意,请考虑考虑accepting it..
猜你喜欢
  • 2010-10-16
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多