| 操作系统 办公 实用知识 设计 开发 WEB开发 移动开发 数据库 软件工程 网管 安全 管理 信息化 答疑 渠道 |
VB.NET中层次数据绑定TreeView的实现
生成树 UpdateTreeView调用私有方法FillTree来生成树,需要注意的,FillTree只是生成指定结点的子结点并将其添加到指定结点,而不是一次就将所有结点添加到树中,如果未指定结点(第一次填充时),只是添加顶层结点。 Private Sub FillTree(ByRef pnode As myTreeNode, 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), ''当有子结点时,为这个结点添加一个空子结点 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, ''当是新增结点引起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, ''定位到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 相关代码请参见源程序,这里不做详述,需要注意的是删除操作并没有删除子结点,只是删除当前结点而已,删除子结点的工作应该在存储过程中递归实现,而不应放在前端。
今日推荐
|
重点推荐
领军企业技术文库
+更多领军技术文库
最新专题
电子杂志订阅
| ||||||||