日期:2014-05-19  浏览次数:20957 次

(winform中)关于 treeview中 checkbox 单选问题。
要求:   点中treeview中的一个checkbox   其他选中的checkbox改为不选  
private       void       UNcheckAllNode(System.Windows.Forms.TreeNodeCollection       nodes)          
{              

      foreach(System.Windows.Forms.TreeNode       tn       in       nodes)          
      {      
        tn.Checked   =false;
        UNcheckAllNode(tn.Nodes);          


        }          

}
我的这个事件要在   AfterCheck以后使用
private   void   treeView1_AfterCheck(object   sender,   System.Windows.Forms.TreeViewEventArgs   e)
{
UNcheckAllNode(treeView1.Nodes);
if   (e.Node.Checked   )
{
Loadresdata(e.Node.Tag.ToString());
//adddata(e.Node);
}
else  
{

deletresdata(e.Node.Tag.ToString());
}
}
结果是   保错未处理的“System.StackOverflowException”类型的异常出现在   system.windows.forms.dll
好像是   溢出了   哪位有什么好办法解决!!

------解决方案--------------------
AfterCheck中调用的方法UNcheckAllNode(treeView1.Nodes)多次触发AfterCheck事件,在这里你应该对事件进行判断,AfterCheck事件是由鼠标还是键盘还是其它途径触发的,只有在由鼠标触发的时候,才调用UNcheckAllNode(treeView1.Nodes)及其它方法
private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
if(e.Action==TreeViewAction.ByMouse)
{
UNcheckAllNode(treeView1.Nodes);
if (e.Node.Checked )
{
Loadresdata(e.Node.Tag.ToString());
//adddata(e.Node);
}
else
{

deletresdata(e.Node.Tag.ToString());
}
}
}