vb.net treeview 數據綁定類

'代碼綁定
'Dim data As New dsTableAdapters.menuTableAdapter
'data.Fill(ds1.menu)
'TreeView1.DataSource = New HierarchicalDataSet(ds1.menu, "ID", "PID")
'TreeView1.DataBind()

'asp.net綁定
'<asp:TreeView ID="TreeView1" runat="server">
'                    <DataBindings>
'                        <asp:TreeNodeBinding DataMember="System.Data.DataRowView" TextField="TITLE" ValueField="ID" />
'                    </DataBindings>
'                </asp:TreeView>

Imports Microsoft.VisualBasic
Imports System.Data

Namespace TreeViewBinding
    Public Class HierarchicalDataSet
        Inherits HierarchicalDataSourceControl

        Public dataSet As DataTable
        Public idColumnName As String
        Public parentIdColumnName As String

        Public Event DataSourceChanged As EventHandler

        Public Sub New(ByVal dataSet As DataTable, ByVal idColumnName As String, ByVal parentIdColumnName As String)
            Me.dataSet = dataSet
            Me.idColumnName = idColumnName
            Me.parentIdColumnName = parentIdColumnName
        End Sub

        Protected Overrides Function GetHierarchicalView(ByVal viewPath As String) As System.Web.UI.HierarchicalDataSourceView
            Return New DataSourceView(Me, viewPath)
        End Function

#Region "supporting_methods"
        Private Function GetParentRow(ByVal row As DataRowView) As DataRowView
            dataSet.DefaultView.RowFilter = String.Format("{0} = {1}", idColumnName, row(parentIdColumnName).ToString())
            Dim parentRow As DataRowView = dataSet.DefaultView(0)
            dataSet.DefaultView.RowFilter = ""
            Return parentRow
        End Function

        Private Function GetChildrenViewPath(ByVal viewPath As String, ByVal row As DataRowView) As String
            Return viewPath + "/" + row(idColumnName).ToString()
        End Function

        Private Function HasChildren(ByVal row As DataRowView) As Boolean
            dataSet.DefaultView.RowFilter = String.Format("{0} = {1}", parentIdColumnName, row(idColumnName))
            Dim hasChild As Boolean = dataSet.DefaultView.Count > 0
            dataSet.DefaultView.RowFilter = ""
            Return hasChild
        End Function
        Private Function GetParentViewPath(ByVal viewPath As String) As String
            Return viewPath.Substring(0, viewPath.LastIndexOf("/"))
        End Function
#End Region

#Region "private classes that implement further interfaces"
        Class DataSourceView
            Inherits HierarchicalDataSourceView

            Private hDataSet As HierarchicalDataSet
            Private viewPath As String

            Public Sub New(ByVal hDataSet As HierarchicalDataSet, ByVal viewPath As String)
                Me.hDataSet = hDataSet
                Me.viewPath = viewPath
            End Sub

            Public Overrides Function [Select]() As System.Web.UI.IHierarchicalEnumerable
                Return New HierarchicalEnumerable(hDataSet, viewPath)
            End Function
        End Class

        Class HierarchicalEnumerable
            Implements IHierarchicalEnumerable

            Private hDataSet As HierarchicalDataSet
            Private viewPath As String

            Public Sub New(ByVal hDataSet As HierarchicalDataSet, ByVal viewPath As String)
                Me.hDataSet = hDataSet
                Me.viewPath = viewPath
            End Sub

            Public Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
                If (viewPath = "") Then
                    hDataSet.dataSet.DefaultView.RowFilter = String.Format("{0} is null", hDataSet.parentIdColumnName)
                Else
                    Dim lastID As String = viewPath.Substring(viewPath.LastIndexOf("/") + 1)
                    hDataSet.dataSet.DefaultView.RowFilter = String.Format("{0} = {1}", hDataSet.parentIdColumnName, lastID)
                End If
                Dim i As IEnumerator = hDataSet.dataSet.DefaultView.GetEnumerator()
                hDataSet.dataSet.DefaultView.RowFilter = ""
                Return i
            End Function

            Public Function GetHierarchyData(ByVal enumeratedItem As Object) As System.Web.UI.IHierarchyData Implements System.Web.UI.IHierarchicalEnumerable.GetHierarchyData
                Dim row As DataRowView = enumeratedItem
                Return New HierarchyData(hDataSet, viewPath, row)
            End Function
        End Class

        Class HierarchyData
            Implements IHierarchyData

            Private hDataSet As HierarchicalDataSet
            Private row As DataRowView
            Private viewPath As String

            Public Sub New(ByVal hDataSet As HierarchicalDataSet, ByVal viewPath As String, ByVal row As DataRowView)
                Me.hDataSet = hDataSet
                Me.viewPath = viewPath
                Me.row = row
            End Sub

            Public Function GetChildren() As System.Web.UI.IHierarchicalEnumerable Implements System.Web.UI.IHierarchyData.GetChildren
                Return New HierarchicalEnumerable(hDataSet, hDataSet.GetChildrenViewPath(viewPath, row))
            End Function

            Public Function GetParent() As System.Web.UI.IHierarchyData Implements System.Web.UI.IHierarchyData.GetParent
                Return New HierarchyData(hDataSet, hDataSet.GetParentViewPath(viewPath), hDataSet.GetParentRow(row))
            End Function

            Public ReadOnly Property HasChildren() As Boolean Implements System.Web.UI.IHierarchyData.HasChildren
                Get
                    Return hDataSet.HasChildren(row)
                End Get
            End Property

            Public ReadOnly Property Item() As Object Implements System.Web.UI.IHierarchyData.Item
                Get
                    Return row
                End Get
            End Property

            Public ReadOnly Property Path() As String Implements System.Web.UI.IHierarchyData.Path
                Get
                    Return viewPath
                End Get
            End Property

            Public ReadOnly Property Type() As String Implements System.Web.UI.IHierarchyData.Type
                Get
                    Return GetType(DataRowView).ToString
                End Get
            End Property
        End Class
#End Region
    End Class
End Namespace

發佈了33 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章