分类目录
文章索引模板
Treeview增加、删除、修改、遍历等操作 - 二月 5, 2010 by yippee

1.使用初步  
   
  (1)下载地址  
  http://msdn.microsoft.com/downloads/samples/internet/default.asp?url=/Downloads/samples/Internet/ASP_DOT_NET_ServerControls/WebControls/default.asp  
   
   
  (2)不显示树型的问题  
  首先:下载包分自动安装和手动安装两种包。  
  要下载大小约650K   的自动安装包。  
  其次:TreeView要求客户端浏览器版本为IE5.5及以上,最好要求客户端升级为IE6.0  
   
  (3)关于闪烁  
  将AutoPostBack属性设置为真,SelectedIndexChange才能被执行。不过这样的话刷新的很厉害。不要刷新的话,将AutoPostBack属性设置为FALSE.          
   
  (4)常用的几个属性和方法  
  ~Index   获取树节点在树节点集合中的位置。  
  ~Nodes   获取分配给树视图控件的树节点集合。  
  ~Parent     获取或设置控件的父容器。  
  ~SelectedNode   获取或设置当前在树视图控件中选定的树节点。  
  ~ExpandAll   展开所有树节点。  
  ~Checked   获取或设置一个值,用以指示树节点是否处于选中状态。  
  ~Text   获取或设置在树节点标签中显示的文本。  
  ~Expand   展开树节点。  
  ~Clear   清空树  
  ~Remove   从树视图控件中移除当前树节点。  
   
  (5)常用的几个操作:增加、删除、修改、剪切  
   
  @增加节点:  
                  Dim   tmpNd3   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  Dim   NdSel   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  ‘NdSel   为当前选定的节点,新节点将作为它的子节点    
                  NdSel   =   Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)  
                  tmpNd3.Text   =   “新增节点”  
                  ‘在树中添加这个新节点  
                  NdSel.Nodes.Add(tmpNd3)  
  @删除节点:  
                  Dim   tmpNd3   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  Dim   NdSel   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  ‘NdSel   为当前选定的要删除节点,tmpNd3为它的父节点    
                  NdSel   =   Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)  
                  If   (Treepaybasic.SelectedNodeIndex   <>   “0″)   Then  
                          tmpNd3   =   NdSel.Parent  
                          tmpNd3.Nodes.Remove(NdSel)  
                  Else  
                          Treepaybasic.Nodes.Clear()  
                  End   If  
  @修改节点:  
                  Dim   NdSel   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  NdSel   =   Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)  
                  NdSel.Text   =   “aaa”  
  @剪切和粘贴  
   
  剪切:  
                  Dim   tmpNd3   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  Dim   NdSel   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  ‘NdSel   为当前选定的要删除节点,tmpNd3为它的父节点    
                  NdSel   =   Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)  
                  ‘将剪切下来的节点存入session  
                  Session(“node”)   =   NdSel  
                  If   (Treepaybasic.SelectedNodeIndex   <>   “0″)   Then  
                          tmpNd3   =   NdSel.Parent  
                          tmpNd3.Nodes.Remove(NdSel)  
                  End   If  
  粘贴:  
                          Dim   tmpNd3   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  Dim   NdSel   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  ‘NdSel   为当前要粘贴节点的父节点    
                  NdSel   =   Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)  
                  tmpNd3   =   Session(“node”)  
                  NdSel.Nodes.Add(tmpNd3)  
  2.用递归生成树的算法和数据库设计  
  (1)递归说明  
      程序调用自身的编程方法称为递归(recursion)。在树的生成以及图的遍历中,递归用的很多。经典的算法求   n!   (求n的阶乘)中,用的就是递归方法。递归算法的优点就是简洁,可扩充性好。但是缺点也很明显:低效。因为递归就是程序不断调用自身,对系统的资源消耗比较大。随着节点的增多,执行效率会变的很低。    
      为了解决树在生成过程中的层树不定的问题,同时也是为了让树的扩展性更好。树的生成使用了递归的方法。生成树的代码一旦写成,可以不改动源代码,生成无限级层次的树。树的结构完全由数据库中表的数据决定。  
  (2)数据库设计  
      创建一个数据库,设计树图信息表Treetable,表中属性包含Nodeid、Parentid、Nodename、Address等字段(分别用于表示节点的ID、父节点ID、节点名称、链接地址),其它属性根据实际用户需求和设计而定。节点名称Nodename将在树型控件的节点上显示,Nodeid字段保存节点的唯一标识号,Parentid表示当前节点的父节点ID号(例如有两个节点是父子关系,孩子节点的Parentid值就是其父节点的Nodeid),节点号父子相接组成了一个“链表”,表征并记录了树上节点的层次结构。  
  表具体设计如下:(简化模型,实际使用的要复杂一些)   主键   属性名   类型   长度   可空   属性含义  
  是   Nodeid   int   6   否   节点ID  
    Parentid   int   6   否   父节点ID  
    Nodename   char   50   否   节点名称  
    Address   char   80   可   链接地址  
   
  备注:链接地址   主要是用在:   树在框架中使用的环境。链接可以指向其他框架页中的地址或是带不同的参数。  
           
   
  (3)程序代码  
  ――――――――――――递归函数――――――――――――  
          ‘生成树的函数  
          Private   Sub   inittree(ByRef   Nds   As   Microsoft.Web.UI.WebControls.TreeNodeCollection,   ByVal   parentId   As   Integer)  
                  Dim   dv   As   New   DataView()  
                  Dim   dvrow   As   DataRowView  
                  Dim   tmpNode   As   Microsoft.Web.UI.WebControls.TreeNode  
                  ‘intId为数值型变量,其作用是记录并传递当前记录的ID,做为它子节点的PARENTID值  
                  Dim   intId   As   Integer  
                  dv.Table   =   mySet.Tables(“paybasic”)  
                  ‘parentId传递的是   additem函数中的intId.下面语句的作用是找出当前节点的子孩子集合。    
                  dv.RowFilter   =   “parentID=’”   &   parentId   &   “‘”  
                  ‘如果当前节点有孩子,则遍历所有的孩子,并调用递归函数。  
                  For   Each   dvrow   In   dv  
                          tmpNode   =   New   Microsoft.Web.UI.WebControls.TreeNode()  
                          ‘为当前节点的各个属性赋值。  
                          tmpNode.ID   =   dvrow(“nodeID”)  
                          tmpNode.Text   =   dvrow(“nodename”)  
                          tmpNode.NavigateUrl   =   dvrow(“Address”)  
                          intId   =   dvrow(“parentID”)  
                          ‘添加一个节点  
                          Nds.Add(tmpNode)  
                          ‘调用递归函数  
                          inittree(Nds(Nds.Count   –   1).Nodes,   intId)  
                  Next  
  End   Sub  
  ――――――――――――――――调用递归函数――――――――――――――――――  
  CreateReaderDataSet()  
  inittree(Treepaybasic.Nodes,   999)  
  ―――――――――――――――――生成数据集―――――――――――――――――――  
          ‘生成数据集的函数  
          Private   Sub   CreateReaderDataSet()  
                  ‘在运行时连接,并设置连接属性  
                  MyConn   =   New   System.Data.OleDb.OleDbConnection(“Provider=MSDAORA.1;Data   Source=oracle9;User   ID=user;Password=****;”)  
                  ‘设置SelectCommand命令  
                  myAdapter.SelectCommand   =   New   System.Data.OleDb.OleDbCommand(“select   *   from   treenode”,   MyConn)  
                  ‘填充数据集  
                  myAdapter.Fill(mySet,   “treenode”)  
          End   Sub  
  与数据库相关的节点操作:  
  (1)添加节点  
      1.1   节点的树型添加  
                  //程序的功能是在点击的节点下面添加新节点  
                  Dim   tmpNd3   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  Dim   NdSel   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  ‘NdSel   为当前选定的要删除节点,tmpNd3为它的父节点    
                  NdSel   =   Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)  
                  ‘要添加的节点的各个属性  
                  tmpNd3.ID   =   111  
                  tmpNd3.Text   =   “aaa”  
                  ‘用nodes.add添加节点  
                  NdSel.Nodes.Add(tmpNd3)  
                         
          1.2   数据库中的节点添加操作  
                          //数据库连接语句在此省略  
                          ‘在运行时连接,并设置连接属性  
                          Dim   insertcomm   =   New   System.Data.OleDb.OleDbCommand()  
                          ‘定义存储命令的各种属性  
                          insertcomm.CommandText   =   “insert   into   treebasic(id,parentid,name)             values(‘”   &   pid   &   “‘,’”   &   parid   &   “‘,’”   &   nodetext   &   “‘)”  
                          insertcomm.Connection   =   MyConn  
                          ‘打开连接、执行命令  
                          MyConn.Open()  
                          insertcomm.ExecuteNonQuery()  
                          MyConn.Close()  
  (2)修改节点  
      2.1   节点属性的树型修改  
                  Dim   tmpNd3   As   New   Microsoft.Web.UI.WebControls.TreeNode()  
                  ‘tmpNd3   为当前选定的节点  
                  tmpNd3   =   Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)  
                  tmpNd3.Text   =   “aaa”  
      2.2   数据库中的节点属性修改操作  
                          ‘定义修改命令的属性  
                          Dim   updatecomm   =   New   System.Data.OleDb.OleDbCommand()  
                          ‘定义修改命令的各种属性  
                              updatecomm.CommandText   =   “update   treebasic   set   name=’”   &   nodetext   &   “‘   ,remark=’”   &   remark   &   “‘   ,links=’”   &   purl   &   “‘   where   payid=”   &   CInt(pid)   &   “”  
                          updatecomm.Connection   =   MyConn  
                          ‘打开连接、执行命令  
                          MyConn.Open()  
                          updatecomm.ExecuteNonQuery()  
                          MyConn.Close()  
   
   
  查找节点并展开的例子,你看看:  
                  Private   Sub   findandexpand_Click(ByVal   sender   As   System.Object,   ByVal   e   As   System.EventArgs)                                                                                                                                                             Handles   Button1.Click  
   
                  ‘Treepaybasic.Nodes(0)   为树的跟节点,从根节点找起  
                  If   (Treepaybasic.Nodes(0).Text   =   Me.TextBox1.Text)   Then  
                          Treepaybasic.SelectedNodeIndex   =   “0″  
                  Else  
                  ‘要找的节点不是根节点,调用递归函数查找  
                          findnode(Treepaybasic.Nodes)  
                  End   If  
                End   Sub  
        ‘查找节点的函数  

标签:
20090623 treeview esc LabelEdit - 八月 18, 2009 by yippee

treeview esc

void treeType_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
        &leftsign;
            Console.WriteLine(e.Label);
            if (e.Label==null)
            &leftsign;
                e.Node.EndEdit(true);
                e.Node.Remove();
            &rightsign;

  CancelEdit  获取或设置指示是否已取消编辑的值。
  Label  获取与树节点关联的新文本。
  Node  获取包含待编辑文本的树节点。

如果用户按 Esc 取消编辑或没有修改标签文本就按 Enter,此属性的值则为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing)。如果用户编辑标签文本,此属性的值则为新的标签文本。即使编辑的标签文本最后的值与其原始值相同,也是如此。

        ~
        I suggest that you set a flag in the BeforeLabelEdit event and reset the
flag in AfterlabelEdit. In KeyDown if flag and KeyCode=vbEscape then you
remove the Node.

Another method is just to add the node with a default name and have the user
to delete the node if he wants to. I believe this is more like the Windows
style.

Leif H

我在treeView中新增节点,并把它处于可编辑状态。但如果我想用Esc键退出新增节点的编辑状态,并把它删除,就调用了treeview的 keydown事件。但如何在treeview的AfterLabelEdit中调用keydown事件呢?请高手指点!!!!!

标签:,
TreeView 控件树状控件的填充VB以及 VS.NET C#源代码 - 二月 23, 2005 by yippee

习惯了树状结构,好像很多国外网站的开发者都称之为 NETSCAPTE PER,可能是因为当时 NETSCAPTE浏览器比较时髦,而且的确也好像是它的属性最开始使用这种对话框模式

VB下面作相对比较简单一点,VC就麻烦多了。闲话少说,www.yippeesoft.com说说填充


数据库:最简单的 的一个表ss 字段:ID/NAME/PARENT,分别代表ID,名称,和父节点的ID,最高层为0

随便几个 1/W/0 2/E/1 3/R/2 4/T/1分别www.yippeesoft.com代表四个不同的节点。


VB就很简单了:

cmd.CommandText = "select * from ss"
rs.CursorLocation = adUseClient
rs.Open cmd, , adOpenDynamic, adLockOptimistic

\’ss.Nodes.Clear
If rs.RecordCount <> 0 Then
    rs.MoveFirst
End If
Whwww.yippeesoft.comile (rs.EOF = False)
    Set nodd = tv_group.Nodes.Add(, tvwLast, Str(rs!id) + "ssID", _
        rs!name, 1)
    Debug.Print nodd.Key
    rs.MoveNext
Wend

If rs.RecordCount <> 0 Then
    rs.MoveFirst
End If
While (rs.EOF = False)
    If (rs!parent <> 0) Then
        Set tv_group.Nodes(Str(rs!id) + "ssID").parent = tv_group.Nodes(Str( _
            rs!parent) + "ssID")
    Else
        tv_grouwww.yippeesoft.comp.Nodes(Str(rs!id) + "ssID").Selected = True
    End If
    rs.MoveNext
Wend

rs.Close

End Sub

首先得到所有的记录,www.yippeesoft.com然后把记录全部填充到树控件 TREECTRL的根目录下,然后把所有父节点非0的节点的PARENT属性设置给上一个KEY为PARENT字段的节点,这样,简简单单就全部填充完毕了


VS.NET就不一样了,PARENT属性好像是只读的,只能用递归

private void InitTree()
  &leftsign;
   tree.Nodes.Clear();
   Cls_Phs_Node www.yippeesoft.comclsnodeP=new Cls_Phs_Node("ss"); //由于TREEVIEW在.NET中的NODE节点属性好像没有KEY这个属性,所以只能自己继承一个类,扩充一个KEY
   clsnodeP.key="0";
   tree.Nodes.Add(clsnodeP); //定义了一个根节点
   OleDbDataAdapter da=new OleDbDataAdapter("select * from ss;",SQLConn);
   DataTable dt=new DataTable();
   da.Fill(dt);
   da.Dispose();
   FillTree(tree.Nodes[0].Nodes,"0",dt);
  &rightsign;

//把数据库表的数据填充在根节点下面
  private void FillTree(www.yippeesoft.comTreeNodeCollection nodes,string parentKey,DataTable table)
  &leftsign;
   foreach(DataRow dr in table.Rows)
   &leftsign;
    if(dr["parent"].ToString()==parentKey.ToString())
    &leftsign;
     Cls_Phs_Node clsnode=new Cls_Phs_Node(dr["name"].ToString().Trim());
     clsnode.key=dr["ID"].ToString().Trim();
     clsnode.type =dr["parent"].ToString().Trim();
     nodes.Add(clsnode);
     FillTree(clsnode.www.yippeesoft.comNodes,dr["ID"].ToString(),table);
    &rightsign;
   &rightsign;
  &rightsign;

不是很明白为什么VS.NET里www.yippeesoft.com面的TREEVIEW控件省掉了NODE的自带KEY属性以及PARENT属性变成只读的,不过没有办法。

这是网上的一个例子,用的DATAVIEW

//  public void FillTree(TreeNodeCollection  Nds,string parentId,DataSet ds,string TableName)
//  &leftsign;      
//   DataView dv=new DataView();
//   TreeNode  tmpNd;
//   string intId;
//   dv.Table=ds.Tables[TableName];
//   dv.RowFilter="ParentId="  + parentId ;
//   foreach(DataRowView drv in dv)
//   &leftsign;  
//    tmpNd=new TreeNode();
//    tmpNd.Tag =drv[0].ToString(); 
//    tmpNd.Text=drv[2].ToString(); 
//    Nds.Add(tmpNd);
//    intId=drv[1].ToString();    
//    InitTree(tmpNd.Nodes,tmpNd.Tag.ToString(),ds,TableName);
//   &rightsign;
//  &rightsign;

标签:, , , , , , ,
ASP.NET IE WEB Control treeview - 二月 18, 2005 by yippee

也许是因为作习惯了应用软件的原因,习惯了TREEVIEW和TABCTRL,准备作ASP.NET后,也是习惯性找了找这方面的控件。网上这方面控件不少,http://www.yippeesoft.com当然优先考虑微软自带的 IE Web Controls。

稍微使用了一下,最后决定放弃。http://www.yippeesoft.com总结一下。

当然这套控件看上去是很美的:包含四个http://www.yippeesoft.com控件,MultiPage Web 控件 TabStrip Web 控件 Toolbar Web 控件 TreeView Web 控件。

我首先试用TREEVIEW,结果第一次出现一个http://www.yippeesoft.com致命的疏忽,没有仔细看README.TXT。安装完后,目录里面就已经有了build目录下的Microsoft.Web.UI.WebControls.dll。

于是我就打开VS.NET,新建了一个WEB应用程序,引用增加DLL,果然在工具箱找到了四个控件,拖放TREEVIEW到窗体,在属性NODES的(Collection)增加了几个节点、子节点。设计模式下看上去挺不错。于是就开始调试运行,结果出现的状况实在糟糕,http://www.yippeesoft.com根本不是一个树控件,而是一堆NODE1、NIDE2等LABEL。

于是想了想,把IE WEB安装目录下的SRC目录下http://www.yippeesoft.com的RUNTIME整个复制到WEBAPP1的BIN目录下,结果还是不行。实在令人沮丧。

翻来覆去,最后看看README.TXT,也许因为大多http://www.yippeesoft.com数软件的README大多是版权申明之类的,所以很少去看,结果这次吃亏了。Internet Explorer Web Controls README

1、先进入.NET的命令行模式,再进入IE WEB的安装目录,然后运行BUILD.BAT

2、  xcopy /s /i .\\build\\Runtime c:\\Inetpub\\wwwroot\\webctrl_client\\1_0 /y

然后再运行WEBAPP1,这下终于可以了。

但是试验了一下,最后决定暂时放弃。http://www.yippeesoft.com

一个是文档问题,没有什么详细文档,第二就是客户端问题,要求客户端是IE6.0。我想这个是致命的问题,如果这个限制的话,那么会损失一部分兼容性的。http://www.yippeesoft.com

不过我以前下载下来的http://www.yippeesoft.com是2002年的,而我在微软站点看到的说明文档有2003年的,不知道是不是有更新,准备上班之后再弄一弄。

标签:, , , , , ,