先介绍下TREE,是多层的,有CHECKBOX,
例TREE
口1--口2.1
-口2.2--口3.1
-口3.2
打算实现的功能是:
1、1的CHECKBOX打钩,2、3的全打钩;1取消钩,2、3也全取消;
2、3部分打钩,1不钩;2、3全钩,1钩;2、3全取消,1取消。
(1已经弄好了,问题在2)
2、TREE字体默认颜色【灰色】。所有打钩的项都变成【黑色】;只要2或3有钩,1就变黑;反则恢复【灰色】。这个主要是用在对一系列任务进行跟踪时,如果主任务里任何一个子任务(包括更下级的子)完成(即打钩变黑),主任务就变黑,表示任务已经展开;都是灰色说明任务还没开始;打钩了说明该任务完成。 下面的语句有3个问题,
1、如果超过2层结构,取消1的钩时主项的字体不变灰;2层以内就可以。
2、如果子项2.2也有子项时,先取消2.1的钩,再把2.2的钩取消掉,1不变灰;
3、如果先取消2.1的钩,然后取消3.1,3.2的钩,虽然子项都没钩了,1也不变灰我找不出应该怎么改,有地方判断出错了,HELP!或者告诉我另外可行的方法 private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
SetNodeCheckStatus(e.Node, e.Node.Checked);
}
if (e.Node.Parent != null && e.Node.Nodes.Count == 0)//子节点
{
if (nextCheck(e.Node.Parent.FirstNode) == true)//全部勾选
{
e.Node.Parent.ForeColor = Color.Black;
} else if (nextNotCheck(e.Node.Parent.FirstNode) == true)//全部不勾选
{
e.Node.Parent.ForeColor = Color.Gray;
}
else
{
e.Node.Parent.ForeColor = Color.Black;
}
return;
}
}
private void SetNodeCheckStatus(TreeNode tn, bool Checked)
{
if (Checked == true)
tn.ForeColor = Color.Black;
if (Checked == false)
tn.ForeColor = Color.Gray;
if (tn == null) return;
// Check children nodes
foreach (TreeNode tnChild in tn.Nodes)
{
tnChild.Checked = Checked;
SetNodeCheckStatus(tnChild, Checked);
}
// Set parent check status
TreeNode tnParent = tn;
int nNodeCount = 0;
while (tnParent.Parent != null)
{
tnParent = (TreeNode)(tnParent.Parent);
nNodeCount = 0;
foreach (TreeNode tnTemp in tnParent.Nodes)
if (tnTemp.Checked == Checked)
nNodeCount++;
if (nNodeCount == tnParent.Nodes.Count)
tnParent.Checked = Checked;
else
tnParent.Checked = false;
}
}
private bool nextCheck(TreeNode n)//判断同级的节点是否全选
{
if (n.Checked == false)
return false;
if (n.NextNode == null)
return true;
return this.nextCheck(n.NextNode);
}
private bool nextNotCheck(TreeNode n)//判断同级的节点是否全不选
{
if (n.Checked == true)
return false;
if (n.NextNode == null)
return true;
return this.nextNotCheck(n.NextNode);
}
例TREE
口1--口2.1
-口2.2--口3.1
-口3.2
打算实现的功能是:
1、1的CHECKBOX打钩,2、3的全打钩;1取消钩,2、3也全取消;
2、3部分打钩,1不钩;2、3全钩,1钩;2、3全取消,1取消。
(1已经弄好了,问题在2)
2、TREE字体默认颜色【灰色】。所有打钩的项都变成【黑色】;只要2或3有钩,1就变黑;反则恢复【灰色】。这个主要是用在对一系列任务进行跟踪时,如果主任务里任何一个子任务(包括更下级的子)完成(即打钩变黑),主任务就变黑,表示任务已经展开;都是灰色说明任务还没开始;打钩了说明该任务完成。 下面的语句有3个问题,
1、如果超过2层结构,取消1的钩时主项的字体不变灰;2层以内就可以。
2、如果子项2.2也有子项时,先取消2.1的钩,再把2.2的钩取消掉,1不变灰;
3、如果先取消2.1的钩,然后取消3.1,3.2的钩,虽然子项都没钩了,1也不变灰我找不出应该怎么改,有地方判断出错了,HELP!或者告诉我另外可行的方法 private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
SetNodeCheckStatus(e.Node, e.Node.Checked);
}
if (e.Node.Parent != null && e.Node.Nodes.Count == 0)//子节点
{
if (nextCheck(e.Node.Parent.FirstNode) == true)//全部勾选
{
e.Node.Parent.ForeColor = Color.Black;
} else if (nextNotCheck(e.Node.Parent.FirstNode) == true)//全部不勾选
{
e.Node.Parent.ForeColor = Color.Gray;
}
else
{
e.Node.Parent.ForeColor = Color.Black;
}
return;
}
}
private void SetNodeCheckStatus(TreeNode tn, bool Checked)
{
if (Checked == true)
tn.ForeColor = Color.Black;
if (Checked == false)
tn.ForeColor = Color.Gray;
if (tn == null) return;
// Check children nodes
foreach (TreeNode tnChild in tn.Nodes)
{
tnChild.Checked = Checked;
SetNodeCheckStatus(tnChild, Checked);
}
// Set parent check status
TreeNode tnParent = tn;
int nNodeCount = 0;
while (tnParent.Parent != null)
{
tnParent = (TreeNode)(tnParent.Parent);
nNodeCount = 0;
foreach (TreeNode tnTemp in tnParent.Nodes)
if (tnTemp.Checked == Checked)
nNodeCount++;
if (nNodeCount == tnParent.Nodes.Count)
tnParent.Checked = Checked;
else
tnParent.Checked = false;
}
}
private bool nextCheck(TreeNode n)//判断同级的节点是否全选
{
if (n.Checked == false)
return false;
if (n.NextNode == null)
return true;
return this.nextCheck(n.NextNode);
}
private bool nextNotCheck(TreeNode n)//判断同级的节点是否全不选
{
if (n.Checked == true)
return false;
if (n.NextNode == null)
return true;
return this.nextNotCheck(n.NextNode);
}
解决方案 »
- 怎么取得指定控件为空为空值的控件ID
- 如何将PrintDocument.PrinterSetting.DefaultPagSettings.PaperSize.Kind 设置为custom
- 突破屏幕限制获取鼠标移动的信息
- 如何更换C# winform开发的程序的图标
- JAVA区看到的,我们也来讨论下
- 关于thread的一个问题
- 菜鸟求教!c#怎样实现客户端浏览器在一定时间内没有刷新页面,客户端的浏览器的页面就自动关闭。
- 关于setupfactory的问题。
- 100跪求~~C#获取当前拨号连接账号代码
- 关于在一个TcpListener中实现多线程的问题
- c#读取字节数组,快来帮忙看下
- 在点击DataGridView的列进行排序时候的问题
private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
SetNodeCheckStatus(e.Node, e.Node.Checked);
}
}
private void SetNodeCheckStatus(TreeNode tn, bool Checked)
{
fnodecolor(tn,Checked);
if (tn == null) return;
// Check children nodes
foreach (TreeNode tnChild in tn.Nodes)
{
tnChild.Checked = Checked;
SetNodeCheckStatus(tnChild, Checked);
}
// Set parent check status
TreeNode tnParent = tn;
int nNodeCount = 0;
while (tnParent.Parent != null)
{
tnParent = (TreeNode)(tnParent.Parent);
nNodeCount = 0;
foreach (TreeNode tnTemp in tnParent.Nodes)
if (tnTemp.Checked == Checked)
nNodeCount++;
if (nNodeCount == tnParent.Nodes.Count)
tnParent.Checked = Checked;
else
tnParent.Checked = false;
}
}
private void fnodecolor(TreeNode pn, bool Checked)
{
if (Checked == true)
{
pn.ForeColor = Color.Black;
if (pn.Parent != null)
{
pn.Parent.ForeColor = Color.Black;
if (pn.Parent.Parent != null)
{
fnodecolor(pn.Parent, Checked);
}
}
}
if (Checked == false)
{
pn.ForeColor = Color.Gray;
if (pn.Parent != null)
{
if (nextColor(pn.Parent.FirstNode) == true)
{
pn.Parent.ForeColor = Color.Gray;
if (pn.Parent.Parent != null)
{
fnodecolor(pn.Parent, Checked);
}
}
}
}
}
private bool nextColor(TreeNode n)//判断同级的节点颜色是否全灰
{
if (n.ForeColor == Color.Black)
return false;
if (n.NextNode == null)
return true;
return this.nextColor(n.NextNode);
}