C# winform中treeview 的checkbox勾选 本帖最后由 dongxiao0517 于 2011-08-22 16:38:52 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 (0x2000)(1) (0)(6) (0xc0)(0xe0 (0x20) (6) (6) COMM_DEBUG_PRINT if(CCU_TRUE == g_ulCommDebug)CCU_Printf 是这样了:1.点父节点,子节点全选:if(TreeNode1.Selected){ foreach(TreeNode tr in TreeNode1.Nodes) { tr.Selected=true; }}2.子节点选部分,父节点显示方块(需要设置为三态显示):if(TreeNode1.Selected){ TreeNode1.Parent.Selected=True;}全部是手写,可能有错误,领会精神,呵呵(其中 TreeNode1 是当前你所选择的节点) 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); } } 5楼的setParentNodeCheckedState方法即可实现你的要求啊,lz仔细看啊。 /// <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); } } } TreeView 加载的时候判断父节点是否为选中状态,如果没选中就判断其子节点是否为全部选中,,,如果没有全部选中就改变此节点的颜色 if()//子节点没全部选中{TreeNode f = new TreeNode(); f.Parent.BackColor = Color.Red;} 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; } } 有个类似的帖子,楼主参考:http://topic.csdn.net/u/20110822/16/6573eb5a-6fad-4efd-81e2-22f58f7b22bd.html 多用户情况下,如何获得某个用户的“我的文档”路径? 求一条SQL语句。 关于分配算法的问题,急用!!! 菜鸟问题。水晶报表10是怎么用的阿?它跟.NET怎么联系在一起呢,还是用.net里的自带水晶控件吗? datagrid problem 关闭窗体到托盘,我想关闭应用程序.不起作用,请教 如何解析XML节点 求正则表达式问题!! C#里有没有Chr()? 急,VS问题 将数据库数据导出到excel:异常来自 HRESULT:0x800A03EC 关于textbox的一些问题
(1)
(0)
(6)
(0xc0)
(0xe0
(0x20)
(6)
(6)
COMM_DEBUG_PRINT if(CCU_TRUE == g_ulCommDebug)CCU_Printf
1.点父节点,子节点全选:
if(TreeNode1.Selected)
{
foreach(TreeNode tr in TreeNode1.Nodes)
{
tr.Selected=true;
}
}
2.子节点选部分,父节点显示方块(需要设置为三态显示):
if(TreeNode1.Selected)
{
TreeNode1.Parent.Selected=True;
}
全部是手写,可能有错误,领会精神,呵呵(其中 TreeNode1 是当前你所选择的节点)
{
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);
}
}
/// 设置所有父节点的选中状态
/// </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);
}
}
}
如果没有全部选中就改变此节点的颜色
{
TreeNode f = new TreeNode();
f.Parent.BackColor = Color.Red;
}
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;
}
}