TreeView使用笔记

TreeView使用笔记
TreeView由节点构成,建树通过对TreeView.items属性进行操作。Items是一个TTreeNodes对象,这是一个TTreeNode集。
  
  
  一、针对TTreeNodes,也就是 TreeView.Items,有这些属性:
  1、count,节点个数。
  2、item[index] ,通过index得到节点。
  
  
  二、针对TTreeNodes,也就是 TreeView.Items,常用的添加节点的操作有:
  AddFirst添加第一个根节点。由此函数添加的节点总排在前面,除非后来又使用此函数添加了一个节点,则后添加的节点将排在前面。该函数返回新添加的节点。
  AddChildFirst添加第一个子节点,要求有父节点作为其参数。返回新添加的节点。
  AddChild添加一个子节点,要求有父节点作为其参数。返回新添加的节点。
  Add添加一个兄弟节点,要求有兄弟节点作为其参数。返回新添加的节点。
  
  
  三、针对TTreeNodes,也就是 TreeView.Items,常用的得到节点的操作有:
  GetFirstNode() 得到根节点。
  然后配合TTreeNode.GetNext(),就可以访问所有的节点。
  
  
  四、建树举例:
  
  
  var
  root_node,cur_node:TTreeNode;
  begin
  root_node:=AddFirst(nil,'根节点1');
  cur_node:=addChildfirst(root_node,nil,'根节点1_child1');
  add(cur_node,'根节点1_child2');
  root_node:=Add(nil,'根节点2');
  AddChildFirst(root_node,''根节点2_child1');
  end;
  
  
  
  
  
  五、事件触发:
  当从一个节点跳到另一个节点,会触发TTreeView.OnChange事件。该事件中,将传递node,即当前被选中的节点。
  
  
  当修改一个节点的text时,会触发TTreeView.onEdit事件。
  
  
  
  六、将节点和节点所对应的数据联系起来
  对于每个TTreeNode,有个Data属性,可以存放一个指针。我们可以利用这个域来存放与节点对应的自己的数据。
  1.我们先定义一个数据结构,作为记录我们要记录的数据。如:
  type
  PMyData=^TMyData;
  TMyData=Record
  sFName:string;
  sLName:String;
  nIndex:integer;
  end;
  
  
  2.然后,创建数时,将节点和节点数据联系起来:
  procedure TForm1.Button1Click(Sender: TObject);
  var
  myshuju: PMyData
  cur_node:TTreeNode;
  begin
  New(MyRecPtr); //记住,一定要先分配内存。有几个节点,就要分配几次内存。
  myshuju^.FName:=Edit1.Text;
  Myshuju^.LName := Edit2.Text;
  TreeViewIndex := StrToInt(Edit3.Text);
  with TreeView1 do
  begin
  cur_node:=items.AddFirst(nil,'first');
  cur_node.data:=myshuju;
  end;
  end;
  
  
  3.当我们选中一个节点时,就可以使用我们的数据了。
  procedure TForm1.TreeView1Change(Sender:TObject;Node:TTreeNode);
  begin
  if node.data<>nil then
  self.label1.caption:=pmyData(node.data)^.Fname+pmyData(node.data)^.Lname
  end;
  
  
  
  七、一般使用流程:
  1、添加全局变量:
  b_first:boolean; //记录是否是第一次访问节点,因为此时数据还未准备好,而一旦访问节点就会触发OnChange事件,在此事件处理函数中也许会出错。
  2、在FormCreate中,
  a、设置b_first:=true;
  b. 创建数并将节点与数据联系。
  3、在FormShow中
  设置b_first:=false;
  4.在事件OnChange中处理节点被选中事件。
  5.在Edit中处理节点被修改Text事件。
  并调用OnChange.
  6.在 TreeView.Destory中
  释放Data 中指向的内存空间


C#:从DataGridView控件托放数据到TreeView控件
实现方法,在datagridview的mousedown事件中开始 托放。
然后在treeview 的 DragEnter 中接收托放。
最后在treeview的 DragDrop 中处理托放结果。
注:treeview的allowdrop属性要设置为 true。

 1private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
 2        {
 3            if (e.Button == MouseButtons.Right)
 4            {
 5                DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y);
 6               
 7                if (info.RowIndex >= 0)
 8                {
 9                    DataGridViewRow dr = (DataGridViewRow)
10                           dataGridView1.Rows[info.RowIndex];
11                    if (dr != null)
12                        dataGridView1.DoDragDrop(dr, DragDropEffects.Copy);
13                }
14            }
15        }
16
17        private void treeView1_DragEnter(object sender, DragEventArgs e)
18        {
19            e.Effect = DragDropEffects.Copy;
20        }
21
22        private void treeView1_DragDrop(object sender, DragEventArgs e)
23        {
24            if (e.Data.GetDataPresent(typeof(DataGridViewRow)))
25            {               
26                Point p = treeView1.PointToClient(new Point(e.X, e.Y));
27                TreeViewHitTestInfo index = treeView1.HitTest(p);
28
29                if (index.Node != null)
30                {
31
32                    DataGridViewRow drv = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));
33                    index.Node.Text = "Drop: " + drv.Cells[0].ToString();
34            
35                }
36            }
37        }

创建可编辑的xml文档(之一)绑定xml文档到treeview 控件

目录:

   介绍

   绑定xml文档到treeview 控件

   过滤xml 数据

   执行拖放操作

   执行删除,改名,插入操作

   使用中的treeview 控件

 

通过xml 和xpath 你可以毫不费力的为你的treeview控件增加拖放甚至更多的功能-by Alex Hildyard

 

最近,我一直在开发一个用来维护在线目录的用户界面工具,因为这个目录包含太多的产品,所以用一些方法对他们分类是很有意义的。目录管理员将需要有删除和定义新的目录的能力,目录和目录之间进行嵌套的能力,还要用巧妙的方式让目录和产品看上去很直观。

象这样的分类情节迫切需要一个按照种类分类的分等级视图,第一:在数据和它的表示之间的映射通常很微不足道的(trivial),因为treeview 控件的对象模型是自身分等级的。第二:展开一个独立的树节点的能力将用多重级别浏览数据变得更容易.最后: 在TreeView中拖放文件夹是快速处理复杂层次非常简单和吸人注意的方法。

几分钟后,我意识到我脑子中的这个应用程序就是Windows Explorer(windows资源管理器), 并且我要重写它,用产品目录代替文件夹,用产品项目代替文件,甚至我可以快速的实现类似创建或者删除文件夹,执行拖放等操作。如果我以后为一个关系数据编写接口,或者编写一个联系管理程序,或者开发一个追踪我的家族族谱的工具,那么我将会发现我做的都是相同的事情。

这么做是很没有意义的,我需要找到一个为treeview 控件提供分级数据源的通用方法,这个就好象为一个数据表格控件(data grid)在数据库创建一个数据表(database table)一样,并且要能够很方便的实现创建、删除、改名、移动、和拖放数据元素的功能,而不需要顾忌询问中的数据源内容的结构

为treeview 控件创建xml 文档:

根据treeview的层次机构,xml 是非常合乎逻辑的数据格式,你可以用少于6行的代码实现在treeview 控件中显示xml文档,假设你有一个类似下面这样的一个xml文档 ,它包含很多联系(contact) 节点:

<?xml version="1.0" encoding="utf-8"?>   <addressbook>      <contacts id="Contacts">         <contact id="Alex">            <email id="popmail">                someone@some_pop_mail.net</email>            <city>Edinburgh</city>            <country>United Kingdom</country>         </contact>         <contact id="Rebekah">            <email id="webmail">               someone@some_web_mail.net</email>            <city>Papakura</city>            <country>New Zealand</country>         </contact>         <contact id="Justin">            <email id="webmail">               someone_else@some_web_mail.com</email>            <city>Muriwai</city>            <country>New Zealand</country>         </contact>      </contacts>   </addressbook>你可以很容易的通过递归调用将所有的数据元素组装到treeview 控件中,把所有的XML 文档节点添加到treeview中以后,就可以通过维护treeview控件来维护维护xml文档的节点关系
[C#]   private void populateTreeControl(      System.Xml.XmlNode document,       System.Windows.Forms.TreeNodeCollection nodes)   {      foreach (System.Xml.XmlNode node in          document.ChildNodes)      {         // If the element has a value, display it;           // otherwise display the first attribute          // (if there is one) or the element name          // (if there isn't)         string text = (node.Value != null ? node.Value :            (node.Attributes != null &&             node.Attributes.Count > 0) ?             node.Attributes[0].Value : node.Name);         TreeNode new_child = new TreeNode(text);         nodes.Add(new_child);         populateTreeControl(node, new_child.Nodes);      }   }   
   [VB]   Private Sub populateTreeControl( _      ByVal document As System.Xml.XmlNode, _      ByVal nodes As _       System.Windows.Forms.TreeNodeCollection)         Dim node As System.Xml.XmlNode      For Each node In document.ChildNodes         ' If the element has a value, display it;          ' otherwise display the first attribute          ' (if there is one) or the element name          ' (if there isn't)         Dim [text] As String         If node.Value <> Nothing Then            [text] = node.Value         Else            If Not node.Attributes Is Nothing And _               node.Attributes.Count > 0 Then               [text] = node.Attributes(0).Value            Else               [text] = node.Name            End If         End If            Dim new_child As New TreeNode([text])         nodes.Add(new_child)         populateTreeControl(node, new_child.Nodes)      Next node   End Sub现在,你可以新建一个windows窗体,拖放一个treeview 控件到窗体上,添加下面三行到你的数据文件中:
[C#]   System.Xml.XmlDocument document =       new System.Xml.XmlDataDocument();   document.Load("../../contacts.xml");   populateTreeControl(document.DocumentElement,       treeView1.Nodes);            
   [VB]   Dim document As New System.Xml.XmlDataDocument()   document.Load("../contacts.xml")   populateTreeControl(document.DocumentElement, _       TreeView1.Nodes)当你展开treeview的节点时,你将看到图一的内容: 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值