您的位置:首页 > 编程语言 > C#

关于C# winform treeview 的两个问题(点击空白处的时间响应和复选框选择问题)

2008-01-16 15:58 661 查看
这段时间正在研究这个控件,摸出了一些东西,给大家看看。

1:点击空白处的问题。
处理鼠标Up事件
private void Tree_MouseUp(object sender, MouseEventArgs e)
{
Point p = new Point(e.X, e.Y);
TreeNode selectNode = AuthTree.GetNodeAt(p);
bool isBlank = false;
if (selectNode == null)
isBlank = true;
else
{
if(selectNode.Bounds.Contains(e.X,e.Y) == false)
isBlank = true;
}
if (isBlank)
{
//处理选择空白
}
}
主要是根据鼠标坐标和节点的两个方法:根据坐标得到节点(GetNodeAt)和节点区域(Bounds)来处理。
2:复选框选择问题
我的想法是选中某个节点时将其所有子节点全部选中,当某节点有子节点选中时则选中这个节点,否则不选择这个
节点。
因为AfterCheck事件是递归触发的,所以处理不当就会进入死循环,我是进入死递归把程序堆栈塞满了。
最后我增加了一个变量保证了连续出发的方向,即从原节点开始,向上更新父节点,向下更新子节点,父节点
不能再向下,子节点也不能向上,解决了这个问题。
int level = -1;
private void Tree_AfterCheck(object sender, TreeViewEventArgs e)
{
TreeNode operateNode = e.Node;
if (this.level == -1)
{
this.level = e.Node.Level;
CheckFatherNode(operateNode);
CheckAllSubNodes(operateNode, operateNode.Checked);
}
else
{
if(e.Node.Level < this.level)
CheckFatherNode(operateNode);
else if(e.Node.Level > this.level)
CheckAllSubNodes(operateNode, operateNode.Checked);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: