C# winform中treeview 的checkbox勾选

dongxiao0517 2011-08-22 04:36:06
即 我勾选父节点,其子节点全部自动勾选,取消父节点勾选其子节点也全部取消勾选,如果只选子节点全选则其父节点自动勾选,如果子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)[/color]
最好能有例子代码
现在我就需要“子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)”的代码,谢谢
...全文
1164 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongxiao0517 2011-08-24
  • 打赏
  • 举报
回复
16楼的报错了 说是出现了无限递归
缭绕飘渺 2011-08-23
  • 打赏
  • 举报
回复
  private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action == TreeViewAction.ByMouse)
{
if (e.Node.Checked)
{
//取消节点选中状态之后,取消所有父节点的选中状态
setChildNodeCheckedState(e.Node, true);
}
else
{
//取消节点选中状态之后,取消所有父节点的选中状态
setChildNodeCheckedState(e.Node, false);
//如果节点存在父节点,取消父节点的选中状态
if (e.Node.Parent != null)
{
setParentNodeCheckedState(e.Node, false);
}
}
}
}
//取消节点选中状态之后,取消所有父节点的选中状态
private void setParentNodeCheckedState(TreeNode currNode, bool state)
{
TreeNode parentNode = currNode.Parent;

parentNode.Checked = state;
if (currNode.Parent.Parent != null)
{
setParentNodeCheckedState(currNode.Parent, state);
}
}
//选中节点之后,选中节点的所有子节点
private void setChildNodeCheckedState(TreeNode currNode, bool state)
{
TreeNodeCollection nodes = currNode.Nodes;
if (nodes.Count > 0)
foreach (TreeNode tn in nodes)
{
tn.Checked = state;
setChildNodeCheckedState(tn, state);
}
}
sjfbtnmcn 2011-08-23
  • 打赏
  • 举报
回复
是这样了:
1.点父节点,子节点全选:
if(TreeNode1.Selected)
{
foreach(TreeNode tr in TreeNode1.Nodes)
{
tr.Selected=true;
}
}
2.子节点选部分,父节点显示方块(需要设置为三态显示):
if(TreeNode1.Selected)
{
TreeNode1.Parent.Selected=True;
}
全部是手写,可能有错误,领会精神,呵呵(其中 TreeNode1 是当前你所选择的节点)
sdl2005lyx 2011-08-23
  • 打赏
  • 举报
回复
不好意思,发错地方了,呵呵。。。
sdl2005lyx 2011-08-23
  • 打赏
  • 举报
回复
xiongxyt2 2011-08-23
  • 打赏
  • 举报
回复
treeView1.CheckBoxes = true;
treeView1.AfterCheck += this.treeView1_AfterCheck;
treeView1.ExpandAll();
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
this.CheckSubNodes(e.Node);
}


private void CheckSubNodes(TreeNode checkRoot)
{
//遍历所有直接子节点,并调整其Check状态为父节点的状态
foreach (TreeNode tn in checkRoot.Nodes)
{
//注意这里本身并没有直接递归调用CheckSubNodes,但是由于这个操作导致了其子节点的状态变化,产生了AfterCheck事件。
tn.Checked = checkRoot.Checked;
}
}
dongxiao0517 2011-08-23
  • 打赏
  • 举报
回复
哎,小方块还是没有显现出来
熙风 2011-08-23
  • 打赏
  • 举报
回复
if()//子节点没全部选中
{
TreeNode f = new TreeNode();
f.Parent.BackColor = Color.Red;
}
rocket2010 2011-08-23
  • 打赏
  • 举报
回复
楼上很多人解决了 我路过........
熙风 2011-08-23
  • 打赏
  • 举报
回复
TreeView 加载的时候判断父节点是否为选中状态,如果没选中就判断其子节点是否为全部选中,,,
如果没有全部选中就改变此节点的颜色
缭绕飘渺 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dongxiao0517 的回复:]

谢谢楼上的,但是我想要的是“子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)”
[/Quote]
这个没搞过
不过感觉如果直接更改系统主题倒是来得简单了
那样的话复选框就能是填充的方块了
熙风 2011-08-23
  • 打赏
  • 举报
回复
  /// <summary>
/// 设置所有父节点的选中状态
/// </summary>
/// <param name="currNode"></param>
/// <param name="state"></param>
private void setParentNodeCheckedState(TreeNode currNode, bool state)
{
TreeNode parentNode = currNode.Parent;

parentNode.Checked = state;
if (currNode.Parent.Parent != null)
{
setParentNodeCheckedState(currNode.Parent, state);
}
}

/// <summary>
/// 设置所有子节点的选中状态
/// </summary>
/// <param name="currNode"></param>
/// <param name="state"></param>
private void setChildNodeCheckedState(TreeNode currNode, bool state)
{
TreeNodeCollection nodes = currNode.Nodes;
if (nodes.Count > 0)
foreach (TreeNode tn in nodes)
{
tn.Checked = state;
setChildNodeCheckedState(tn, state);
}
}


/// <summary>
/// 控制正选,反选,以及选中子节点的时候选中父节点,取消父节点则取消所有子节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tvModules_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action == TreeViewAction.ByMouse)
{
if (e.Node.Checked)
{
//节点选中后,选中所有子节点
setChildNodeCheckedState(e.Node, true);

//节点选中之后,选中所有父节点
if (e.Node.Parent != null)
{
setParentNodeCheckedState(e.Node, true);
}
}
else
{
//取消节点选中后,取消所有子节点的选中状态
setChildNodeCheckedState(e.Node, false);
}
}
}
dongxiao0517 2011-08-23
  • 打赏
  • 举报
回复
我试过了,但是不行
inttoint 2011-08-23
  • 打赏
  • 举报
回复
回帖加分——用来提问
  • 打赏
  • 举报
回复
5楼的setParentNodeCheckedState方法即可实现你的要求啊,lz仔细看啊。
dongxiao0517 2011-08-23
  • 打赏
  • 举报
回复
谢谢楼上的,但是我想要的是“子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)”
xyl_ztj 2011-08-22
  • 打赏
  • 举报
回复
(0x2000)
(1)
(0)
(6)
(0xc0)
(0xe0
(0x20)
(6)
(6)
COMM_DEBUG_PRINT if(CCU_TRUE == g_ulCommDebug)CCU_Printf
hhloong 2011-08-22
  • 打赏
  • 举报
回复
拿分走人
dongxiao0517 2011-08-22
  • 打赏
  • 举报
回复
顶顶顶顶顶

110,569

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧