Winform的treeview里的checkbox问题

时间:2021-03-03 19:37:39
我的treeview有三层如:
中国
   广东
      广州
      深圳
   安徽
      合肥
      .......
我选项中广东时,下面的广州,深圳也选上,选中国时都选上,大致是这样的.然后得到选中的值,这个过程怎么实现,要源码.谢谢.,

18 个解决方案

#1


private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
TreeNode n =  e.Node;
CheckSubNode(n.Nodes, true);

}

//用这个
void CheckSubNode(TreeNodeCollection nodes, bool isChecked)
{
foreach(TreeNode node in nodes)
{
node.Checked = isChecked;

if (node.Nodes.Count>0)
{
CheckSubNode(node.Nodes, isChecked);
}
}
}

#2


private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
CheckSubNode(e.Node.Nodes, e.Node.Checked);
}

#3


偶还没明白你用的哪个treeview哩!BS还是CS那个 方法不一样地

#4


哦 没注意题目 当我没说 !上面老大们也解决了 呵呵

#5


楼主说了是 winform!

#6


就是一个递归调用

#7


鼎鼎强,你不用上班吗,
怎么到处都上你回的帖啊!
呵呵!

#8


鼎鼎强,上面已写了是winform.c/s 的.我的QQ是:408954312.高手们在讲解问题的时候能不能留下高人们的QQ或MSN号.谢谢了.还没有思路啊.等待....

#9


private void tvList_BeforeSelect
                  (object sender,System.Windows.Forms.TreeViewCancelEventArgs e)
{
txtShow.Text=e.Node.Text;
}


加一句代码就行了 txtShow.Text=e.Node.Text;
放到 treeview1_BeforeSelect 这个事件里

#10


我靠,高手就是高手啊.运行了一下,果然可以啊.我选中的这些值怎么得到,然后怎么去分别他们.谢谢.搞完结帖.

#11


刚才偶得帖子没说清楚,txtShow是显示选中节点值得文本框,tvlist是treeview控件

msn:breeze_1982@hotmail.com

#12


breeze_82(一天学一点) :txtShow哪里来的

#13


weisunding(鼎鼎) ,你号是多少,我还有不明白的地方,想当面请教.谢谢.

#14


多选的值我还是得不到啊.等等.....

#15


鼎鼎的代码并不全。他只是影响了子节点,但父节点并没有。
bool blJmp = false;//标志
private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
    if(this.blJmp)return;
foreach(TreeNode tn in e.Node.Nodes)//影响子节点
{
tn.Checked = e.Node.Checked;
}
         this.blJmp = true;
this.SetCheck(e.Node);//处理父节点
         this.blJmp = false;
}
private void SetCheck(TreeNode n)
{
if(n.Checked)//如果当前节点选中,则父节点也要选取中
{
this.parentNode(n,n.Checked);
}
else//如果当前节点没有选中,且同级节点中都没有选中,则父节点也不要选中
{
if(n.Parent != null)
{
//如果同一级中没有被选中,则其父级也同时设为不选中,在这种情况下,递归父节点
if(this.nextNotCheck(n.Parent.FirstNode))
{
n.Parent.Checked = false;
this.SetCheck(n.Parent);
}
}
}
}
private void parentNode(TreeNode n,bool check)
{
if(n.Parent != null)
{
n.Parent.Checked = check;
this.parentNode(n.Parent,check);
}
}
//下一个节点是不是没有选中
private bool nextNotCheck(TreeNode n)
{
if(n.Checked) return false;
if(n.NextNode == null) return true;
return this.nextNotCheck(n.NextNode);
}

#16


楼主给我回消息有什么问题,是取多选的值吗??

#17


是多选的取值,你的号多少啊.

#18


n.Parent.Checked中,n.Parent没有Checked属性.

#1


private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
TreeNode n =  e.Node;
CheckSubNode(n.Nodes, true);

}

//用这个
void CheckSubNode(TreeNodeCollection nodes, bool isChecked)
{
foreach(TreeNode node in nodes)
{
node.Checked = isChecked;

if (node.Nodes.Count>0)
{
CheckSubNode(node.Nodes, isChecked);
}
}
}

#2


private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
CheckSubNode(e.Node.Nodes, e.Node.Checked);
}

#3


偶还没明白你用的哪个treeview哩!BS还是CS那个 方法不一样地

#4


哦 没注意题目 当我没说 !上面老大们也解决了 呵呵

#5


楼主说了是 winform!

#6


就是一个递归调用

#7


鼎鼎强,你不用上班吗,
怎么到处都上你回的帖啊!
呵呵!

#8


鼎鼎强,上面已写了是winform.c/s 的.我的QQ是:408954312.高手们在讲解问题的时候能不能留下高人们的QQ或MSN号.谢谢了.还没有思路啊.等待....

#9


private void tvList_BeforeSelect
                  (object sender,System.Windows.Forms.TreeViewCancelEventArgs e)
{
txtShow.Text=e.Node.Text;
}


加一句代码就行了 txtShow.Text=e.Node.Text;
放到 treeview1_BeforeSelect 这个事件里

#10


我靠,高手就是高手啊.运行了一下,果然可以啊.我选中的这些值怎么得到,然后怎么去分别他们.谢谢.搞完结帖.

#11


刚才偶得帖子没说清楚,txtShow是显示选中节点值得文本框,tvlist是treeview控件

msn:breeze_1982@hotmail.com

#12


breeze_82(一天学一点) :txtShow哪里来的

#13


weisunding(鼎鼎) ,你号是多少,我还有不明白的地方,想当面请教.谢谢.

#14


多选的值我还是得不到啊.等等.....

#15


鼎鼎的代码并不全。他只是影响了子节点,但父节点并没有。
bool blJmp = false;//标志
private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
    if(this.blJmp)return;
foreach(TreeNode tn in e.Node.Nodes)//影响子节点
{
tn.Checked = e.Node.Checked;
}
         this.blJmp = true;
this.SetCheck(e.Node);//处理父节点
         this.blJmp = false;
}
private void SetCheck(TreeNode n)
{
if(n.Checked)//如果当前节点选中,则父节点也要选取中
{
this.parentNode(n,n.Checked);
}
else//如果当前节点没有选中,且同级节点中都没有选中,则父节点也不要选中
{
if(n.Parent != null)
{
//如果同一级中没有被选中,则其父级也同时设为不选中,在这种情况下,递归父节点
if(this.nextNotCheck(n.Parent.FirstNode))
{
n.Parent.Checked = false;
this.SetCheck(n.Parent);
}
}
}
}
private void parentNode(TreeNode n,bool check)
{
if(n.Parent != null)
{
n.Parent.Checked = check;
this.parentNode(n.Parent,check);
}
}
//下一个节点是不是没有选中
private bool nextNotCheck(TreeNode n)
{
if(n.Checked) return false;
if(n.NextNode == null) return true;
return this.nextNotCheck(n.NextNode);
}

#16


楼主给我回消息有什么问题,是取多选的值吗??

#17


是多选的取值,你的号多少啊.

#18


n.Parent.Checked中,n.Parent没有Checked属性.