'代碼綁定
'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