VB.NET中層次數據綁定TreeView的完成。本站提示廣大學習愛好者:(VB.NET中層次數據綁定TreeView的完成)文章只能為提供參考,不一定能成為您想要的結果。以下是VB.NET中層次數據綁定TreeView的完成正文
提要:在VB6中,常將TreeView用來表示層次數據,但相關的與數據庫停止交互的代碼,需求少量的采用手工編碼;在VB.net中,由於數據綁定功用的增強及言語特性的加強,可以很容易的完成TreeView與層次數據的綁定,本文將首先樹立一個承繼自TreeView的 dbTreeView,然後用一個單位(部門)的層次數據與dbTreeView停止數據綁定,並提供了與數據庫停止交互的代碼。
1、從層次數據的表達方式開端
在本例中,部門表(department)中有五個字段,如下表:
字段名 字段 類型闡明 ID 自動編號 Key Code String 編碼 Name String 稱號 PID Int 父結點的ID CPtr boolean 能否有子結點
2、承繼自TreeNode的myTreeNode
在myTreeNode中,新增了三個屬性,如下表:
屬性名 類型 闡明 Value Object Key PID Object 父結點的ID CPtr Boolean 能否有子結點
在Init事情中,依據傳入的四個參數,設置這三個屬性和Text屬性。
3、將dbTreeView綁定到數據源
屬性名 類型 闡明 Datasource dataview dbTreeVIew的數據源運用dataview,而不是object Value Member string值成員(數據源[dataview]的列名) Display Member string顯示(在Text中)成員 Pid Member string父ID成員 CPtr Member string能否有子結點
後四個屬性對應myTreeNode的value,text,pid,cptr。
相關代碼如下:
Protected Property DataSource() As Object
Get
Return mDataView
End Get
Set(ByVal Value As Object)
If Value Is Nothing Then
Else
mDataView = Value
cm = CType(Me.BindingContext(mDataView), CurrencyManager)
UpdateTreeView()
End If
End Set
End Property
Protected Property PidMember() As String
Get
Return mPidMember
End Get
Set(ByVal Value As String)
mPidMember = Value
End Set
End Property
Protected Property DisplayMember() As String
Get
Return Join(mDisplayMember, SplitChar)
End Get
Set(ByVal Value As String)
mDisplayMember = Split(Value, SplitChar)
End Set
End Property
'留意,這幾個屬性都是維護成員,必需在Init事情中設置:
Public Sub Init(ByVal dispmember As String, ByVal valuemember As String, ByVal pidmember As String, ByVal cptrmember As String, ByVal datasource As DataView)
Me.ValueMember = valuemember
Me.DisplayMember = dispmember
Me.PidMember = pidmember
Me.CPtrMember = cptrmember
Me.DataSource = datasource
'取value最大值,新增時將value+1,保證關健值獨一。
Me.mDataView.Sort = Me.ValueMember
Me.m_MaxID = Me.GetValue(Me.mDataView.Count - 1)
End Sub
設置DisplayMember屬性的格式如:字段1;字段2;字段3…
在設置屬性時,將傳來的參數轉換為字符串數組mDisplayMember,在檢索值時前往數據如:值1 值2 值3.…
Protected Overridable Function GetDisplay(ByVal Index As Integer) As Object
Dim i As Integer
Dim temp As String = ""
For i = 0 To mDisplayMember.Length - 1
temp = temp & IIf(i > 0, LinkChar, "") & mDataView(Index)(mDisplayMember(i))
Next
Return temp
End Function
其它檢索值的函數請參見源順序。
生成樹
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
順序運轉後界面如下:
相關代碼請參見源順序,這裡不做詳述,
需求留意的是刪除操作並沒有刪除子結點,只是刪除以後結點而已,刪除子結點的任務應該在存儲進程中遞歸完成,而不應放在前端。