Kreirao sam svoju kontrolu datasource prema primjeru koji se nalazi u
.NET Framework dokumentaciji (FileSystemDataSource).
Problem je sljedeci
1.Kada pokusam pokrenuti primjer dobivam exception tipa stackoverflow.
No recimo ako zadani folder nema podfoldera stvar radi kako spada.
2.Ista stvar je i sa kontrolom koju sam kreirao.
Ako ne koristim datasource kontrolu vec bindam direktno na treeview kontrolu
Code:
Dim dsv As HierarchicalDataSourceView = new HierarchicalDataSourceView("")
tree.datasource = dsv.select
tree.DataBind()
Dim dsv As HierarchicalDataSourceView = new HierarchicalDataSourceView("")
tree.datasource = dsv.select
tree.DataBind()
Onda stvar donekle radi kako spada. Tj ne radi jer za svaki objekt prikazuje njegove child objekte bez obzira da
li su vec prikazani ili ne.Recimo ako ima 10 podataka kojih treba prikazati kontrola ce prikazati 10 ili vise zapisa
ovisno o tome da li neki objekt ima child objekt.
Ako ima netko da isproba primjer koji se nalazi u dokumentaciji pa da mi kaze da li dobiva isti klinac kao ja.
Vise ni sam ne znam sta da isprobam. Probao sam sve metode u klasama testirati i sve rade kako spadaju.
Code:
Public Class CategoryDataSource : Inherits HierarchicalDataSourceControl
Private _view As CategoryDataSourceView = Nothing
Protected Overrides Function GetHierarchicalView(ByVal viewPath As String) As System.Web.UI.HierarchicalDataSourceView
If _view Is Nothing Then
_view = New CategoryDataSourceView(viewPath)
End If
Return _view
End Function
End Class
Public Class CategoryDataSourceView : Inherits HierarchicalDataSourceView
Public Sub New(ByVal viewpath As String)
End Sub
Public Overrides Function [Select]() As System.Web.UI.IHierarchicalEnumerable
Dim ce As CategoryEnumerable = New CategoryEnumerable
Dim _cc As CategoryCollection = ShopManager.GetAllCategories()
If _cc.Count > 0 Then
For Each c As Category In _cc
ce.Add(New CategoryData(c))
Next
End If
Return ce
End Function
End Class
Public Class CategoryData : Implements IHierarchyData, INavigateUIData
Private _c As Category = Nothing
Private _cc As CategoryCollection = Nothing
Public Sub New(ByVal c As Category)
_c = c
_cc = ShopManager.GetAllCategories
End Sub
Public Function GetChildren() As System.Web.UI.IHierarchicalEnumerable Implements System.Web.UI.IHierarchyData.GetChildren
Dim ce As CategoryEnumerable = New CategoryEnumerable
RecursiveAdd(ce, _c)
Return ce
End Function
Private Sub RecursiveAdd(ByRef ce As CategoryEnumerable, ByVal c As Category)
For i As Integer = 0 To _cc.Count - 1
Dim _c As Category = _cc(i)
If c.Categoryid = _c.ParentCategoryid And _c.Categoryid <> c.Categoryid Then
' RecursiveAdd(ce, _c)
ce.Add(New CategoryData(_c))
End If
Next
End Sub
Public Function GetParent() As System.Web.UI.IHierarchyData Implements System.Web.UI.IHierarchyData.GetParent
Dim cd As CategoryData = Nothing
If _c.ParentCategoryid <> 0 Then
For i As Integer = 0 To _cc.Count - 1
Dim c As Category = _cc(i)
If _c.ParentCategoryid = c.Categoryid Then
cd = New CategoryData(c)
End If
Next
End If
Return cd
End Function
Public ReadOnly Property HasChildren() As Boolean Implements System.Web.UI.IHierarchyData.HasChildren
Get
Dim has As Boolean = False
For i As Integer = 0 To _cc.Count - 1
Dim c As Category = _cc(i)
If _c.Categoryid = c.ParentCategoryid Then
has = True
End If
Next
Return has '_c.HasChild
End Get
End Property
Public ReadOnly Property Item() As Object Implements System.Web.UI.IHierarchyData.Item
Get
Return _c
End Get
End Property
Public ReadOnly Property Path() As String Implements System.Web.UI.IHierarchyData.Path
Get
Return _c.Description
End Get
End Property
Public ReadOnly Property Type() As String Implements System.Web.UI.IHierarchyData.Type
Get
Return "CategoryData"
End Get
End Property
Public ReadOnly Property Description() As String Implements System.Web.UI.INavigateUIData.Description
Get
Return _c.Name
End Get
End Property
Public ReadOnly Property Name() As String Implements System.Web.UI.INavigateUIData.Name
Get
Return _c.Name
End Get
End Property
Public ReadOnly Property NavigateUrl() As String Implements System.Web.UI.INavigateUIData.NavigateUrl
Get
Return "Default.aspx?categoryid="
End Get
End Property
Public ReadOnly Property Value() As String Implements System.Web.UI.INavigateUIData.Value
Get
Return _c.Name
End Get
End Property
End Class
Public Class CategoryEnumerable : Inherits ArrayList
Implements IHierarchicalEnumerable
Public Function GetHierarchyData(ByVal enumeratedItem As Object) As System.Web.UI.IHierarchyData Implements System.Web.UI.IHierarchicalEnumerable.GetHierarchyData
Return CType(enumeratedItem, IHierarchyData)
End Function
End Class
Public Class CategoryDataSource : Inherits HierarchicalDataSourceControl
Private _view As CategoryDataSourceView = Nothing
Protected Overrides Function GetHierarchicalView(ByVal viewPath As String) As System.Web.UI.HierarchicalDataSourceView
If _view Is Nothing Then
_view = New CategoryDataSourceView(viewPath)
End If
Return _view
End Function
End Class
Public Class CategoryDataSourceView : Inherits HierarchicalDataSourceView
Public Sub New(ByVal viewpath As String)
End Sub
Public Overrides Function [Select]() As System.Web.UI.IHierarchicalEnumerable
Dim ce As CategoryEnumerable = New CategoryEnumerable
Dim _cc As CategoryCollection = ShopManager.GetAllCategories()
If _cc.Count > 0 Then
For Each c As Category In _cc
ce.Add(New CategoryData(c))
Next
End If
Return ce
End Function
End Class
Public Class CategoryData : Implements IHierarchyData, INavigateUIData
Private _c As Category = Nothing
Private _cc As CategoryCollection = Nothing
Public Sub New(ByVal c As Category)
_c = c
_cc = ShopManager.GetAllCategories
End Sub
Public Function GetChildren() As System.Web.UI.IHierarchicalEnumerable Implements System.Web.UI.IHierarchyData.GetChildren
Dim ce As CategoryEnumerable = New CategoryEnumerable
RecursiveAdd(ce, _c)
Return ce
End Function
Private Sub RecursiveAdd(ByRef ce As CategoryEnumerable, ByVal c As Category)
For i As Integer = 0 To _cc.Count - 1
Dim _c As Category = _cc(i)
If c.Categoryid = _c.ParentCategoryid And _c.Categoryid <> c.Categoryid Then
' RecursiveAdd(ce, _c)
ce.Add(New CategoryData(_c))
End If
Next
End Sub
Public Function GetParent() As System.Web.UI.IHierarchyData Implements System.Web.UI.IHierarchyData.GetParent
Dim cd As CategoryData = Nothing
If _c.ParentCategoryid <> 0 Then
For i As Integer = 0 To _cc.Count - 1
Dim c As Category = _cc(i)
If _c.ParentCategoryid = c.Categoryid Then
cd = New CategoryData(c)
End If
Next
End If
Return cd
End Function
Public ReadOnly Property HasChildren() As Boolean Implements System.Web.UI.IHierarchyData.HasChildren
Get
Dim has As Boolean = False
For i As Integer = 0 To _cc.Count - 1
Dim c As Category = _cc(i)
If _c.Categoryid = c.ParentCategoryid Then
has = True
End If
Next
Return has '_c.HasChild
End Get
End Property
Public ReadOnly Property Item() As Object Implements System.Web.UI.IHierarchyData.Item
Get
Return _c
End Get
End Property
Public ReadOnly Property Path() As String Implements System.Web.UI.IHierarchyData.Path
Get
Return _c.Description
End Get
End Property
Public ReadOnly Property Type() As String Implements System.Web.UI.IHierarchyData.Type
Get
Return "CategoryData"
End Get
End Property
Public ReadOnly Property Description() As String Implements System.Web.UI.INavigateUIData.Description
Get
Return _c.Name
End Get
End Property
Public ReadOnly Property Name() As String Implements System.Web.UI.INavigateUIData.Name
Get
Return _c.Name
End Get
End Property
Public ReadOnly Property NavigateUrl() As String Implements System.Web.UI.INavigateUIData.NavigateUrl
Get
Return "Default.aspx?categoryid="
End Get
End Property
Public ReadOnly Property Value() As String Implements System.Web.UI.INavigateUIData.Value
Get
Return _c.Name
End Get
End Property
End Class
Public Class CategoryEnumerable : Inherits ArrayList
Implements IHierarchicalEnumerable
Public Function GetHierarchyData(ByVal enumeratedItem As Object) As System.Web.UI.IHierarchyData Implements System.Web.UI.IHierarchicalEnumerable.GetHierarchyData
Return CType(enumeratedItem, IHierarchyData)
End Function
End Class