如何停用 Treeview CheckBox
How to deactiveating Treeview's CheckBox
我有两个 treeview
和一些节点,通过使用所需的命令,它们后面有复选框。现在我想制作一些节点 gray/deative。为此,我从第一个树视图中选择一个节点,然后在另一个树视图中,所有 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;
}
}
}
}
}
当然这不会去灰色节点,而是会删除节点后面的复选框(如果你让我知道制作灰色的方法,我将非常感激)。
现在我不知道应该把这个函数放在哪里才能对代码产生影响。有人帮我吗?
这是不可能通过简单地设置一个 属性 来实现的。
您既不能禁用单个 Node
,也不能删除它的 CheckBox
。
您可以执行以下操作:
- 您可以单独更改每个
Node
的 ForeColor
- 您可以阻止单独更改任何
Node
的 Checked
状态
这是一个例子:
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; };
给enable/disable一个Node
最好用一个功能:
void SetNode(TreeNode node, bool enabled)
{
node.ForeColor = enabled ? SystemColors.ControlText : Color.Gray;
node.Tag = enabled ? null : "X";
}
要禁用CheckBox
外观,您必须自己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);
};
我有两个 treeview
和一些节点,通过使用所需的命令,它们后面有复选框。现在我想制作一些节点 gray/deative。为此,我从第一个树视图中选择一个节点,然后在另一个树视图中,所有 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;
}
}
}
}
}
当然这不会去灰色节点,而是会删除节点后面的复选框(如果你让我知道制作灰色的方法,我将非常感激)。
现在我不知道应该把这个函数放在哪里才能对代码产生影响。有人帮我吗?
这是不可能通过简单地设置一个 属性 来实现的。
您既不能禁用单个 Node
,也不能删除它的 CheckBox
。
您可以执行以下操作:
- 您可以单独更改每个
Node
的ForeColor
- 您可以阻止单独更改任何
Node
的Checked
状态
这是一个例子:
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; };
给enable/disable一个Node
最好用一个功能:
void SetNode(TreeNode node, bool enabled)
{
node.ForeColor = enabled ? SystemColors.ControlText : Color.Gray;
node.Tag = enabled ? null : "X";
}
要禁用CheckBox
外观,您必须自己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);
};