最好能有例子代码
现在我就需要“子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)”的代码,谢谢
19 个解决方案
#1
顶顶顶顶顶
#2
拿分走人
#3
(0x2000)
(1)
(0)
(6)
(0xc0)
(0xe0
(0x20)
(6)
(6)
COMM_DEBUG_PRINT if(CCU_TRUE == g_ulCommDebug)CCU_Printf
(1)
(0)
(6)
(0xc0)
(0xe0
(0x20)
(6)
(6)
COMM_DEBUG_PRINT if(CCU_TRUE == g_ulCommDebug)CCU_Printf
#4
是这样了:
1.点父节点,子节点全选:
if(TreeNode1.Selected)
{
foreach(TreeNode tr in TreeNode1.Nodes)
{
tr.Selected=true;
}
}
2.子节点选部分,父节点显示方块(需要设置为三态显示):
if(TreeNode1.Selected)
{
TreeNode1.Parent.Selected=True;
}
全部是手写,可能有错误,领会精神,呵呵(其中 TreeNode1 是当前你所选择的节点)
1.点父节点,子节点全选:
if(TreeNode1.Selected)
{
foreach(TreeNode tr in TreeNode1.Nodes)
{
tr.Selected=true;
}
}
2.子节点选部分,父节点显示方块(需要设置为三态显示):
if(TreeNode1.Selected)
{
TreeNode1.Parent.Selected=True;
}
全部是手写,可能有错误,领会精神,呵呵(其中 TreeNode1 是当前你所选择的节点)
#5
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);
}
}
#6
谢谢楼上的,但是我想要的是“子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)”
#7
5楼的setParentNodeCheckedState方法即可实现你的要求啊,lz仔细看啊。
#8
回帖加分——用来提问
#9
我试过了,但是不行
#10
/// <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);
}
}
}
#11
这个没搞过
不过感觉如果直接更改系统主题倒是来得简单了
那样的话复选框就能是填充的方块了
#12
TreeView 加载的时候判断父节点是否为选中状态,如果没选中就判断其子节点是否为全部选中,,,
如果没有全部选中就改变此节点的颜色
如果没有全部选中就改变此节点的颜色
#13
楼上很多人解决了 我路过........
#14
if()//子节点没全部选中
{
TreeNode f = new TreeNode();
f.Parent.BackColor = Color.Red;
}
{
TreeNode f = new TreeNode();
f.Parent.BackColor = Color.Red;
}
#15
哎,小方块还是没有显现出来
#16
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;
}
}
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;
}
}
#18
不好意思,发错地方了,呵呵。。。
#19
16楼的报错了 说是出现了无限递归
#20
#1
顶顶顶顶顶
#2
拿分走人
#3
(0x2000)
(1)
(0)
(6)
(0xc0)
(0xe0
(0x20)
(6)
(6)
COMM_DEBUG_PRINT if(CCU_TRUE == g_ulCommDebug)CCU_Printf
(1)
(0)
(6)
(0xc0)
(0xe0
(0x20)
(6)
(6)
COMM_DEBUG_PRINT if(CCU_TRUE == g_ulCommDebug)CCU_Printf
#4
是这样了:
1.点父节点,子节点全选:
if(TreeNode1.Selected)
{
foreach(TreeNode tr in TreeNode1.Nodes)
{
tr.Selected=true;
}
}
2.子节点选部分,父节点显示方块(需要设置为三态显示):
if(TreeNode1.Selected)
{
TreeNode1.Parent.Selected=True;
}
全部是手写,可能有错误,领会精神,呵呵(其中 TreeNode1 是当前你所选择的节点)
1.点父节点,子节点全选:
if(TreeNode1.Selected)
{
foreach(TreeNode tr in TreeNode1.Nodes)
{
tr.Selected=true;
}
}
2.子节点选部分,父节点显示方块(需要设置为三态显示):
if(TreeNode1.Selected)
{
TreeNode1.Parent.Selected=True;
}
全部是手写,可能有错误,领会精神,呵呵(其中 TreeNode1 是当前你所选择的节点)
#5
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);
}
}
#6
谢谢楼上的,但是我想要的是“子节点没有全部勾选,最好也希望父节点能以其它状态表示(如有颜色的方块)”
#7
5楼的setParentNodeCheckedState方法即可实现你的要求啊,lz仔细看啊。
#8
回帖加分——用来提问
#9
我试过了,但是不行
#10
/// <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);
}
}
}
#11
这个没搞过
不过感觉如果直接更改系统主题倒是来得简单了
那样的话复选框就能是填充的方块了
#12
TreeView 加载的时候判断父节点是否为选中状态,如果没选中就判断其子节点是否为全部选中,,,
如果没有全部选中就改变此节点的颜色
如果没有全部选中就改变此节点的颜色
#13
楼上很多人解决了 我路过........
#14
if()//子节点没全部选中
{
TreeNode f = new TreeNode();
f.Parent.BackColor = Color.Red;
}
{
TreeNode f = new TreeNode();
f.Parent.BackColor = Color.Red;
}
#15
哎,小方块还是没有显现出来
#16
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;
}
}
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;
}
}
#17
#18
不好意思,发错地方了,呵呵。。。
#19
16楼的报错了 说是出现了无限递归