VB.NET中treeview的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB.NET中treeview的使用相关的知识,希望对你有一定的参考价值。

我不清楚怎么添加treeview的子节点,格式是怎么样的,就是已经有根节点了,在根节点下面再添加节点,要用代码添加,有例子更好,谢谢

Nodes 集合包含分配给 TreeView 控件的所有 TreeNode 对象。此集合中的树节点称作根树节点。随后添加到根树节点上的任何树节点称作子节点。由于每个 TreeNode 都可以包含其他 TreeNode 对象的集合,您可能会在循环访问集合时觉得很难确定自己在树结构中的位置。您可以使用 PathSeparator 字符串值来分析 TreeNode.FullPath 字符串,以确定 TreeNode 标签的起始和终止位置。

可以在树节点旁显示图像,方法是将一个 ImageList 分配给 ImageList 属性,然后通过引用 Image 在 ImageList 中的索引值来分配该 Image。使用下面的属性分配图像:

将 ImageIndex 属性设置为当树节点未选定时所显示的 Image 的索引值。

将 SelectedImageIndex 属性设置为当树节点被选定时要显示的 Image 的索引值。

ImageIndex 和 SelectedImageIndex 属性值所引用的图像是所有分配给 Nodes 集合的树节点显示的默认图像。每个树节点都可以通过设置 TreeNode.ImageIndex 和 TreeNode.SelectedImageIndex 属性来取代默认的图像。

树节点可以展开,以显示下一级子树节点。用户可以在 TreeNode 旁显示加号 (+) 按钮时通过单击加号 (+) 按钮来展开 TreeNode,或者可以通过调用 TreeNode.Expand 方法来展开 TreeNode。若要展开 Nodes 集合中的所有子树节点级别,请调用 ExpandAll 方法。若要折叠子 TreeNode 级别,可以调用 TreeNode.Collapse 方法,也可以在 TreeNode 旁显示减号 (-) 按钮时按减号 (-) 按钮。还可以通过调用 TreeNode.Toggle 方法在展开和折叠状态之间切换。

树节点可以选择性地显示复选框。若要显示复选框,请将 TreeView 的 CheckBoxes 属性设置为 true。对于处于选中状态的树节点,Checked 属性设置为 true。

注意
从 BeforeCheck 或 AfterCheck 事件内设置 TreeNode.Checked 属性将导致该事件被多次引发并可能产生意外行为。例如,您可以在递归更新子节点时在事件处理程序中设置 Checked 属性,以便用户不必逐个展开并选中每个节点。如果未将 TreeViewEventArgs 的 Action 属性设置为 TreeViewAction.Unknown,则若要防止该事件被多次引发,需为仅执行递归代码的事件处理程序添加逻辑。有关如何进行此操作的示例,请参见 AfterCheck 或 BeforeCheck 事件的示例部分。

通过设置 TreeView 控件的一些显示和样式属性,可以更改此控件的外观。如果将 ShowPlusMinus 设置为 true,则会分别在每个可展开或折叠的 TreeNode 旁显示加号或减号按钮。如果将 ShowRootLines 属性设置为 true,TreeView 则会显示联接所有根树节点之间的连线。通过将 ShowLines 属性设置为 true,可以显示子树节点与其根节点之间的连线。如果将 HotTracking 属性设置为 true,那么当鼠标指针移过树节点标签时,树节点标签的外观将发生变化。如果启用热跟踪,树节点标签将具有超链接的外观。也可以完全自定义 TreeView 控件的外观。若要执行此操作,请将 DrawMode 属性设置为 TreeViewDrawMode.Normal 以外的值并处理 DrawNode 事件。

注意
在运行时设置 CheckBoxes、Scrollable、ImageIndex 和 SelectedImageIndex 属性时,将重新创建 TreeView 句柄(请参见 Control.RecreateHandle)以更新控件的外观。这将折叠除选定的 TreeNode 之外的所有树节点。

下面的代码示例阐释了如何使用 TreeView 控件。

Private Sub InitializeTreeView()
treeView1.BeginUpdate()
treeView1.Nodes.Add("Parent")
treeView1.Nodes(0).Nodes.Add("Child 1")
treeView1.Nodes(0).Nodes.Add("Child 2")
treeView1.Nodes(0).Nodes(1).Nodes.Add("Grandchild")
treeView1.Nodes(0).Nodes(1).Nodes(0).Nodes.Add("Great Grandchild")
treeView1.EndUpdate()
End Sub

From MSDN
参考技术A 使用 TreeView 控件
TreeView

TreeView 控件可以用来显示具有层次结构的数据,例如组织树、索引项、磁盘中的文件和目录等。

图 2.40 典型的 TreeView

可能的用途
创建用户可以操作的组织树。

创建能够显示至少两层或更多层的数据库树。
设置 Node 对象属性
“树”由一些层叠的“节点”分支构成,每个节点通常包括图象(用 Image 属性设置)和标签(由 Text 属性设置)。节点的图象由与 TreeView 控件相关联的 ImageList 控件提供。关于与其它控件共同使用 ImageList 控件的更多信息,请参阅“使用 ImageList 控件”。

节点可被展开或折回,这取决于它是否有子节点,即从它出发的节点。在最上层是“根”节点,每个“根”节点可以具有任何数目的子节点。节点的总数没有限制(除非受到机器资源的限制)。图 2.41 显示了具有两个根节点的树。其中“Root 1”有三个子节点,“Child 3”自己又有一个子节点。“Root 2”有子节点,由“+”号指出,但没有展开。

图 2.41 根和子节点

树中的每个节点实际上是可编程的 Node 对象,它属于 Nodes 集合。同在其它集合中一样,集合的每个成员具有唯一的 Index 和 Key 属性,通过这些属性可以访问相应节点的其它属性。例如,下面的代码用特定节点的 Index (“7”) 设置其 Image 和 Text 属性:

tvwMyTree.Nodes(7).Image = "closed"
tvwMyTree.Nodes(7).Text = "IEEE"

然而,如果唯一的键被赋给了该节点,例如“7 ID”,那么上述代码可被改写如下:

tvwMyTree.Nodes("7 ID").Image = "closed"
tvwMyTree.Nodes("7 ID").Text = "IEEE"

节点间的关系和对关系节点的引用
每个节点可以是子节点,也可以是父节点,这取决于它与其它节点之间的关系。Node 对象具有一些属性,可以用来返回子节点或父节点的各种信息。例如,下面的代码用 Children 属性返回某个节点的子节点个数。

MsgBox tvwMyTree.Nodes(10).Children

然而,另外一些属性与 Children 属性不同,它们不返回信息,但返回对其它节点对象的引用。例如,Parent 属性返回对特定节点(只要该节点不是根节点)的父节点的引用。利用该引用,可以调用适用于 Node 对象的任何方法或设置属性来管理其父节点。例如,下面的代码返回父节点的 Text 和 Index 属性:

MsgBox tvwMyTree.Nodes(10).Parent.Text
MsgBox tvwMyTree.Nodes(10).Parent.Index

提示 使用 Set 语句处理 Node 类型的对象,以管理对其它 Node 对象的引用。例如,下面的代码将 Node 对象变量设置为 Parent 属性返回的引用。然后用该对象变量返回相关节点的属性:

Dim tempNode As Node '声明对象变量。
'将对象变量设置为返回的引用。
Set tempNode = tvwMyTree.Nodes(10).Parent
MsgBox tempNode.Text '返回父节点的 Text。
MsgBox tempNode.Index '返回父节点的 Index。

向 Nodes 集合中添加 Node 对象
要将 Node 添加到树中,可以用 Add 方法(Nodes 集合)。该方法包括两个参数,relative 和 relationship,它们确定节点被加到何处。第一个参数 relative 指定节点名称,第二个参数 relationship 指定新加入的节点与名为 relative 的节点之间的关系。

例如,下面的代码添加名为“11 node”的节点,并使其成为名为“7 node”的节点的子节点。固有常数 tvwChild 指出新节点是前一参数所指定的节点的子节点。第三个参数设置新节点的 Key 属性。

tvwMyTree.Nodes.Add "7 node", tvwChild, "11 node"

其它可能的关系包括:

常数 值 描述
tvwLast 1 该 Node 被放在所有与 relative 节点同级的节点之后。
tvwNext 2 该 Node 放在名为 relative 的节点之后。
tvwPrevious 3 该 Node 放在名为 relative 的节点之前。
tvwChild 4 该 Node 成为名为 relative 节点的子节点。

例如,假设已存在三个节点,如果想将第四个节点放在第二个和第三个节点之间,则代码如下:

'假设第二个节点的 Key 值为“2 node”。
tvwMyTree.Nodes.Add "2 node", tvwNext

Add 方法的其它参数是 key、text 和 image。用这些参数,可以在创建 Node 对象时,为其赋予 Key、Text 和 Image 属性。

详细信息 关于 Nodes 集合 Add 方法的更多信息,请在索引搜索中键入“Add 方法”并单击“Add 方法 (Nodes 集合)”,参阅“Add 方法”。

添加节点的第二个方法是:声明 Node 类型的对象变量,然后使用带 Add 方法的 Set 语句。该 Set 语句将该对象变量设置为新节点。然后就可以用该对象变量设置节点的属性,如下所示:

Dim nodX As Node
Set nodX = tvwMyTree.Nodes.Add("10 node", tvwChild)
nodX.Key = "11 node"
nodX.Text = "IEEE"
nodX.Image = "closed"

提示 使用带 Add 的 Set 语句,可使代码可读性强、容易调试。然而,如果使用 Add 方法及其参数添加节点,代码速度更快。

Listview

ListView 控件可使用四种不同视图显示项目。通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。

语法

ListView

说明

可使用 ListView 控件将称作 ListItem 对象的列表条目组织成下列四种不同的视图之一:

大(标准)图标

小图标

列表

报表
View 属性决定在列表中控件使用何种视图显示项目。还可用 LabelWrap 属性控制列表中与项目关联的标签是否可换行显示。另外,还可管理列表中项目的排序方法和选定项目的外观。

ListView 控件包括 ListItem 和 ColumnHeader 对象。ListItem 对象定义 ListView 控件中项目的各种特性,诸如:

项目的简要描述。

由 ImageList 控件提供的与项目一起出现的图标。

附加的文本片段,称作子项目,它们与显示在报表视图中的 ListItem 对象关联。
可以使用 HideColumnHeaders 属性决定是否在 ListView 控件中显示列标头。列标头可以在设计时添加,也可以在运行时添加。设计时,使用 ListView“控件属性”对话框的“列首”选项卡添加列标头。运行时,使用 Add 方法添加 ColumnHeader 对象到 ColumnHeaders 集合中。

发行注意 ListView 控件是 Mscomctl.ocx 文件中一组 ActiveX 控件的一部分。若要在应用程序中使用 ListView 控件,则必须将 Mscomctl.ocx 文件添加到工程中。当发行应用程序时,请将 Mscomctl.ocx 文件安装到用户的 Microsoft Windows System 或 System32 目录下。关于如何将 ActiveX 控件添加到 Visual Basic 工程的详细信息,请参阅 Visual Basic《程序员指南》。

我把我做的一个有关treeview和listview的事例给你,你参考一下
----------------------------以下为模块代码
  Option Explicit
  
  Public Cnn As ADODB.Connection
  Public ServerName As String
  '服务器名
  Public DBname As String
  '数据库名
  Public UserName As String
  '用户名
  Public PassWord As String
  '密码
  Public rsTree As ADODB.Recordset
  Public rsList As ADODB.Recordset
  
  
  Public Function IniDB() As Boolean
   '初始化连接函数
   On Error GoTo MyErr
   IniDB = False
   Set Cnn = New ADODB.Connection
   With Cnn
   .ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=" & UserName & ";PWD=" & PassWord & ";Initial Catalog=" & DBname & ";Data Source=" & ServerName
   '连接字符串
   .CommandTimeout = 10
   '连接等待时间
   .CursorLocation = adUseClient
   '游标类型
   .Open
   End With
   IniDB = True
   Exit Function
  MyErr:
   MyErr
  End Function
  
  
  Public Sub MyErr()
   MsgBox "错误号:" & Err.Number & vbCrLf & "错误源:" & Err.Source & vbCrLf & "错误描述:" & Err.Description, vbCritical, "对不起,出现错误!"
   Err.Clear
  End Sub
  =================================以下为窗体代码==========================================
  'treeview控件名为tvwtree,listview控件名为lvwtree
  Private Sub Form_Load()
   ServerName = "."
   DBname = "northwind"
   UserName = "sa"
   If IniDB() = False Then
   MsgBox "数据连接失败,请启动SQL SERVER服务"
   Exit Sub
   End If
   Dim NodeX As Node
   Set rsTree = New ADODB.Recordset
   rsTree.Open "select * from dept order by dlevel,did", Cnn, adOpenStatic, adLockOptimistic
   Do Until rsTree.EOF
   If rsTree.Fields("dlevel") = 0 Then
   TvwTree.Nodes.Add , , "k" & rsTree.Fields("did").Value, rsTree.Fields("dname").Value
   Else
   TvwTree.Nodes.Add "k" & rsTree.Fields("dtid").Value, tvwChild, "k" & rsTree.Fields("did").Value, rsTree.Fields("dname").Value
   End If
   rsTree.MoveNext
   Loop
  End Sub
  
  
  
  
  
  
  
  Private Sub TvwTree_NodeClick(ByVal Node As MSComctlLib.Node)
   LvwTree.ListItems.Clear
   Set rsList = New ADODB.Recordset
   rsList.Open "select * from dept where dname='" & TvwTree.SelectedItem & "'", Cnn, adOpenStatic, adLockOptimistic
   If rsList.Fields("dend") = 0 Then
   rsList.Close
   rsList.Open "select * from dept where dtid=(select did from dept where dname='" & TvwTree.SelectedItem & "')", Cnn, adOpenStatic, adLockOptimistic
   Do Until rsList.EOF
   LvwTree.View = lvwList
   LvwTree.ListItems.Add , , rsList.Fields("dname")
   rsList.MoveNext
   Loop
   Else
   Dim Temp As Integer
   Temp = rsList.Fields("did").Value
   rsList.Close
   rsList.Open "select * from emp where edid=" & Temp, Cnn, adOpenStatic, adLockOptimistic
   Do Until rsList.EOF
   LvwTree.View = lvwList
   LvwTree.ListItems.Add , , rsList.Fields("ename")
   rsList.MoveNext
   Loop
   End If
  End Sub

如何使用 Vb.net 在 Openoffice 中进行 Mailmerge

【中文标题】如何使用 Vb.net 在 Openoffice 中进行 Mailmerge【英文标题】:How to do Mailmerge in Openoffice using Vb.net 【发布时间】:2009-01-29 11:56:12 【问题描述】:

它的第 5 个问题,除此之外,我没有得到专家的答复....

希望这次我能得到帮助。

我想使用 Vb.net 在 openoffice 中进行邮件合并,而我对 openoffice 完全陌生。 我在网上搜索了一些帮助以了解如何将 openoffice 与 vb.net 一起使用,但我得到的只是一半信息.....所以请你帮我并给我在 vb.net for openoffice 中的 mailmerge 代码。

【问题讨论】:

“邮件合并”到底是什么意思?而且“请给我代码”不会增加你得到答案的机会。 【参考方案1】:

好吧,我有 DB 中的工人名单,并且有这个设施,如果他们想邮寄给所有或部分工人,那么他们可以做到。我现在使用 Microsoft Office 作为插件完成了这项任务,我们是提供使用 Open Office 执行相同任务的设施。

他们所要做的就是选择工作人员列表并单击一个按钮,它将使用数据库中这些工作人员数据的字段自动进行邮件合并。我的代码如下所示

Public Sub OpenOfficeMail(ByVal StrFilter As String)
    Dim oSM ''Root object for accessing OpenOffice from VB
    Dim oDesk, oDoc As Object ''First objects from the API
    Dim arg(-1) ''Ignore it for the moment !

    ''Instanciate OOo : this line is mandatory with VB for OOo API
    oSM = CreateObject("com.sun.star.ServiceManager")
    ''Create the first and most important service
    oDesk = oSM.createInstance("com.sun.star.frame.Desktop")

    ''Create a new doc
    oDoc = oDesk.loadComponentFromURL("private:factory/swriter", "_blank", 0, arg)
    ''Close the doc
    oDoc.Close(True)
    oDoc = Nothing

    ''Open an existing doc (pay attention to the syntax for first argument)
    oDoc = oDesk.loadComponentFromURL("file:///C:\Users\Savan\Documents\1.odt", "_blank", 0, arg)
    Dim t_OOo As Type
    t_OOo = Type.GetTypeFromProgID("com.sun.star.ServiceManager")
    Dim objServiceManager As New Object
    objServiceManager = System.Activator.CreateInstance(t_OOo)
    Dim oMailMerge As New Object
    oMailMerge = t_OOo.InvokeMember("createInstance", Reflection.BindingFlags.InvokeMethod, Nothing, _
 objServiceManager, New [Object]() "com.sun.star.text.MailMerge") 'com.sun.star.text.MailMerge")
    oMailMerge.DocumentURL = "file:///C:\Users\Savan\Documents\1.odt"
    oMailMerge.DataSourceName = CreateSource(StrFilter)''Function that will return the datasource name which will be a text file's path
    oMailMerge.CommandType = 0
    oMailMerge.Command = "file:///C:\Mail.txt"
    oMailMerge.OutputType = 2
    oMailMerge.execute(New [Object]() )**---->I am getting Error here**
End Sub

【讨论】:

以上是关于VB.NET中treeview的使用的主要内容,如果未能解决你的问题,请参考以下文章

vb.net中treeview控件用法

已经添加了具有相同键 TREEVIEW vb.net 和 sql server 的项目

VB.net 实现TreeView控件的拖拽事件

VB.net如何动态获取菜单栏中的菜单名并用树型表示

VB.net datagridview 折叠展开

Odoo8在TreeView左上角增加自定义按钮以及通过继承生成自定义的View_Mode