treeview
最近整理自己的资料,发现我有很多关于treeview控件的资料,原来我花了那么多的时间在它上面,其实它用起来还是蛮简单的,只是当时未发现而已。
我一般来说,构树的时候,都是采用递归算法的,如下:
public void AddTree(string ParentID,TreeNode pNode,TreeView tvn,string str_dt)
{
DataSet ds=(DataSet) this.ViewState[str_dt];
DataView dvTree = new DataView(ds.Tables[0]);
//过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "父材料编号 ='"+ParentID+"'";
foreach(DataRowView Row in dvTree)
{
TreeNode Node=new TreeNode() ;
if(pNode == null)
{ //添加根节点
Node.ID=Row["自定义编号"].ToString();
Node.Text = Row["材料编号"].ToString()+" "+Row["材料名称"].ToString();
tvn.Nodes.Add(Node);
AddTree(Row["自定义编号"].ToString(), Node,tvn,str_dt); //再次递归
}
else
{ //?添加当前节点的子节点
Node.ID=Row["自定义编号"].ToString();
Node.Text = Row["材料编号"].ToString()+" "+Row["材料名称"].ToString();
pNode.Nodes.Add(Node);
AddTree(Row["自定义编号"].ToString(),Node,tvn,str_dt); //再次递归
}
}
一次输入所需要的参数即可,方便. 在这里说一下ViewState,它只能在页面回传间时通信,可以存储数据,如:
在ViewState存放数据:
ViewState[key]= value;
或
ViewState.Add(key,value);
至于取数据吗,看上面吧,或者查资料,嘿嘿......好像这个表情满傻的..........
就这样完了吗,没有,如果我们想点击树的节点连接到某处,比如连接到网易(我最钟情的网站):
Node.NavigateUrl="http://www.163.com";
Node.Target="main";
当然,你也可以传递参数,不过不知道网易认不认.........
如果我们想触发事件呢,那就惨了....因为,微软的这个控件在web编程中就三个事件:onexpand , oncollapse
和 onselectedindexchange,我们需要使用的是第三个,要触发这个事件,还的将AutoPostBack 属性设置为 true,设置完后,你会发现,你点那个地方,它都闪的利害,别扭啊,有解决方案吗,你说呢,没有我说它干么:
将autopostback设置成false;
在body里添加 <body onload="initTree()">
然后在PageLoad里写:
string strTreeName = "ndd";
string strRef = Page.GetPostBackEventReference(ndd);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("<script language=\"JavaScript\">\n"+"<!--\n"+"function initTree()"
+"{\n"+""+strTreeName+".onSelectedIndexChange = function(){\n"+ "if(event.oldTreeNodeIndex!="
+"event.newTreeNodeIndex)\n"+"this.queueEvent('onselectedindexchange',"
+"event.oldTreeNodeIndex+','+event.newTreeNodeIndex);\n"+"window.setTimeout"
+"('"+strRef.Replace("'","\\'")+"',0,'JavaScript');\n"+"}\n"+"}\n"+"//-->\n");
sb.Append("</");
sb.Append("script>");
string strScript=sb.ToString();
Page.RegisterClientScriptBlock("InitTree",strScript);
这样就只有你点击的节点更改的时候才提交!这点经验不知道是从哪位仁兄那借来的,敬请原谅.....
...只听得楼梯咚咚直响,大英雄抬头一看,至吓得呆呆发愣.....哎呀,不好,评书的词出来了,书接上文,说了这么一些,下面再说一下Nodes节点集合的使用,它怎么使用,你怎么总问我,你问我我问谁..
上面我们已经看到了,我们将自己设定好的节点添加到Nodes节点集合中,也就是说Nodes节点集合是用来添加节点的(简单功能,说多了,怕你不懂),举个例子吧,
假如说,你想将你自己定义的节点节点2添加到父节点中,那么这样写: treeview1.Nodes[j].Nodes.Add(节点2);注:j是父节点的索引号,某位仁兄说了,怎么知道索引号呢,自己想办法吧.
顺便介绍一下GetNodeFromIndex吧,从字面的意思看get得到,node节点,from从,index索引,就是说从索引得到节点.比如说:ndd.GetNodeFromIndex(j).ID它的作用就是取得指定索引的ID号.
接下去介绍什么呢,我想想,别催,正忙着呢,(待续)
浙公网安备 33010602011771号