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号.
        接下去介绍什么呢,我想想,别催,正忙着呢,(待续)

posted on 2004-07-17 11:35  老刀  阅读(1553)  评论(2)    收藏  举报

导航