请教高人关于treeview的问题!
我设计的treeview控件是带有复选框的,想编写一段C#程序,如果选中了某个子节点,则选中该子节点的所有父节点,如果选中了父节点,则选中该父节点的所有子节点,应该如何做,怎么老是出错啊。
谢谢!
问题点数:20、回复次数:8Top
1 楼sunnydde(dde)回复于 2005-04-01 11:42:44 得分 8
第一个问题
private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
if(treeView1.SelectedNode.Checked)
setnodechecked(treeView1.SelectedNode);
}
private void setnodechecked(TreeNode myNode)
{
if(myNode.Parent!=null)
{
myNode.Parent.Checked=true;
setnodechecked(myNode.Parent);
}
}
Top
2 楼sunnydde(dde)回复于 2005-04-01 12:07:24 得分 0
第二个
private void setchildNode(TreeNode mytn)
{
foreach(TreeNode tn in mytn.Nodes )
{
tn.Checked=true;
if (tn.Nodes.Count>0)
{
setchildNode(tn);
}
}
}
private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
if(treeView1.SelectedNode.Checked)
{
setchildNode(treeView1.SelectedNode);
}Top
3 楼yidishui1570(一滴水)回复于 2005-04-02 02:06:40 得分 2
upTop
4 楼jluhappyman(小子)回复于 2005-04-04 13:06:03 得分 0
不行啊,我想要同时的,就是说如果点选的那个NODE已经处于选中状态了,则取消选中状态,并且如果有子结点则子结点也都取消选中,如果那个NODE没有选中,则选中那个NODE并且如果有上层结点则也选中,如果有子结点也选中子结点,按上面那么做会是死循环。麻烦高手在看看,指教下,谢谢!Top
5 楼sunnydde(dde)回复于 2005-04-04 18:47:47 得分 0
private void treeView1_BeforeCheck(object sender, System.Windows.Forms.TreeViewCancelEventArgs e)
{
if(e.Action==TreeViewAction.ByMouse)
{
if(e.Node.Checked==false)
{
SetChildNode(e.Node,true);
SetParentNode(e.Node,true);
}
else
{
SetChildNode(e.Node,false);
SetParentNode(e.Node,false);
}
}
}
private void SetParentNode(TreeNode tn ,bool check)
{
if(tn.Parent!=null)
{
tn.Parent.Checked=check;
SetParentNode(tn.Parent,check);
}
}
private void SetChildNode(TreeNode tn ,bool check)
{
foreach(TreeNode mytn in tn.Nodes)
{
mytn.Checked=check;
if(mytn.Nodes.Count>0)
{
SetChildNode(mytn,check);
}
}
}Top
6 楼sunnydde(dde)回复于 2005-04-04 18:49:24 得分 2
你是想写在select事件里还是check事件里?上面我是写在check里面的。 .Top
7 楼lovvver(ElephantTalk.Bright)回复于 2005-04-04 19:04:41 得分 8
//find two dealerid is whether in one lineal family.
private int ChkLineal(string DealerId ,string DEALERID)
{
//if DealerId equals DEALERID(node)
if (DealerId.ToString () == DEALERID.ToString ())
return 0;
//if DealerId is the parent(grand...) of the DEALERID
if (ChkPC(DealerId,DEALERID))
return -1;
//if DealerId is the son(grand...) of the DEALERID
if (ChkPC(DEALERID,DealerId))
return 1;
return -2;
}
//check the childid is whether the child of the parentid or not.
private bool ChkPC(string parentid,string childid)
{
bool iResult = false;
string strExpr = " parent_id = "+parentid;
DataRow[] drs = dt.Select (strExpr);
foreach(DataRow dr in drs)
{
if (dr["dealer_id"].ToString () == childid)
{
iResult = true;
}
else
{
if (ChkPC(dr["dealer_id"].ToString (),childid))
iResult = true;
}
}
return iResult;
}
//然后遍历整个treeview
对每个节点进行判断:
if (ChkLineal(node.Tag .ToString (),DEALERID) != -2)
{
//意思是选中,写的不对。
node.Checked = true;
}Top
8 楼jluhappyman(小子)回复于 2005-04-05 11:30:33 得分 0
谢谢sunnydde(dde) 及 lovvver(春晖) 那么热心,不过sunnydde(dde)的程序还是有点问题,就是当将某个子节点的check变为false(也就是取消选择时),他不管其它的子节点是否有选中的就把他的父节点的选中状态取消了,而此时该父节点的子节点还有处于选中状态的,lovvver(春晖)那个没太仔细看,好象也有点问题,不过总之谢谢二位,我找了个控件做了,不过还是想麻烦sunnydde(dde)看能不能把代码修改过来,我好学习学习,我想写在aftercheck中,明天结帖子,谢谢!!!Top




