科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VB.NET中层次数据绑定TreeView的实现

VB.NET中层次数据绑定TreeView的实现

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

其它检索值的函数请参见源程序。

来源:soft6 2008年5月24日

关键字: 实现 绑定 VB vb.net Windows

  • 评论
  • 分享微博
  • 分享邮件


其它检索值的函数请参见源程序。

生成树

UpdateTreeView调用私有方法FillTree来生成树,需要注意的,FillTree只是生成指定结点的子结点并将其添加到指定结点,而不是一次就将所有结点添加到树中,如果未指定结点(第一次填充时),只是添加顶层结点。

Private Sub FillTree(ByRef pnode As myTreeNode,
Optional ByVal filter As String = "")

 mDataView.RowFilter = filter

 Dim i As Integer, icol As Integer

 Dim newnode As myTreeNode

 RemoveHandler cm.PositionChanged, AddressOf cm_PositionChanged

 Me.BeginUpdate()

 For i = 0 To mDataView.Count() - 1

newnode = New myTreeNode(GetDisplay(i), GetValue(i), GetPid(i),
GetCPtr(i))

''当有子结点时,为这个结点添加一个空子结点

If newnode.CPtr Then

 Dim nullnode As New myTreeNode()

 nullnode.Value = NoExpandNodeValue

 newnode.Nodes.Add(nullnode)

End If

If pnode Is Nothing Then

 Me.Nodes.Clear()

 Me.Nodes.Add(newnode)

Else

 pnode.Nodes.Add(newnode)

End If

 Next

 Me.EndUpdate()

 mDataView.RowFilter = ""

 AddHandler cm.PositionChanged, AddressOf cm_PositionChanged

End Sub

在展开有子结点的结点前,删除所有子结点,再用FillTree为待展开结点新增子结点。

Private Sub dbTreeView_BeforeExpand(ByVal sender As Object,
ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) Handles MyBase.BeforeExpand

 ''当是新增结点引起BeforeExpand事件时,直接退出。

 If ExpandWhenAddNode Then Exit Sub

 ''在展开结点前更新子结点

 Dim currentnode As myTreeNode = CType(e.Node, myTreeNode)

 With currentnode

.Nodes.Clear()

FillTree(currentnode, mPidMember & "= " & CInt(.Value))

 End With

End Sub

4、实现数据与绑定控件的同步

要实现两个方面的同步:

(1)其它绑定控件(如textbox等)应与TreeView当前结点所指向的记录位置一致。

Private Sub dbTreeView_AfterSelect(ByVal sender As Object,
ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles MyBase.AfterSelect
 If e.Node Is Nothing Then Exit Sub

 ''定位到position

 cm.Position = GetPosition(CType(e.Node, myTreeNode).Value)

 If AllowEdit Then

oldNode = e.Node

oldPos = cm.Position

 End If

End Sub

(2)在其它绑定控件改变了数据源后,更新树结点,这个工作在触发CurrencyManager的PositionChanged事件时进行。

Public Sub cm_PositionChanged(ByVal sender As Object, ByVal e As System.EventArgs)

 If CType(Me.SelectedNode, myTreeNode).Value <> GetValue(cm.Position) Then

Debug.WriteLine("Current node isn''t correct point to currencymanager.position!")

Me.SelectedNode = FindNodeByValue(GetValue(cm.Position), Me.Nodes)

 End If

 If AllowEdit Then

If Me.SelectedNode Is Nothing AndAlso cm.Position = cm.Count - 1 Then

 ''当新增记录时,新增树结点

 If CType(cm.Current, DataRowView).IsNew Then

Me.SelectedNode = AddNode(cm.Position)

Exit Sub

 End If

End If

If Not oldNode Is Nothing Then

 If CType(oldNode, myTreeNode).Value = GetValue(oldPos) Then

''更新老结点

oldNode.Text = GetDisplay(oldPos)

 Else

 End If

End If

 End If

End Sub

使用dbTreeView

相关代码请参见源程序,这里不做详述,需要注意的是删除操作并没有删除子结点,只是删除当前结点而已,删除子结点的工作应该在存储过程中递归实现,而不应放在前端。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章