[06/12/2005 - Programmazione]
Utilizzare un array per popolare un controllo Menu o TreeView di ASP.Net 2.0
I nuovi controlli di ASP.Net 2.0 utilizzano la nuova HierarchicalDataSourceView
Quando si utilizzano i Data controls di ASP.Net si possono assegnare direttamente degli array di dati alla proprietà Datasource del controllo, come ad esempio:
<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
DataList1.DataSource = New String() {"uno", "due", "tre"}
DataList1.DataBind()
End Sub
</script>
...
...
<asp:DataList ID="DataList1" runat="server">
<ItemTemplate>
<%# Container.DataItem %>
</ItemTemplate>
</asp:DataList>
Il problema nasce quando si vanno ad utilizzare i nuovi controlli Menu or Treeview, con i quali questa semplice assegnazione non funziona. Infatti questi controlli utilizzano una HierarchicalDataSourceView che richiede un nuovo tipo IHierarchicalEnumerable, che effettua l'enumerazione del tipo IHierarchyData. Un soluzione è quella di implementare queste due interfacce in maniera "minimale".
Public Class HierarchicalData
Implements IHierarchicalEnumerable
Private data As ArrayList
Public Sub New(ByVal values() As String)
data = New ArrayList()
For Each value As String In values
data.Add(New HierarchicalDataElement(value))
Next
End Sub
Public Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
Return data.GetEnumerator()
End Function
Public Function GetHierarchyData(ByVal enumeratedItem As Object) As System.Web.UI.IHierarchyData Implements System.Web.UI.IHierarchicalEnumerable.GetHierarchyData
Return CType(enumeratedItem, HierarchicalDataElement)
End Function
End Class
Public Class HierarchicalDataElement
Implements IHierarchyData
Public _data As String
Public Sub New(ByVal data As String)
_data = data
End Sub
Public Function GetChildren() As System.Web.UI.IHierarchicalEnumerable Implements System.Web.UI.IHierarchyData.GetChildren
Return Nothing
End Function
Public Function GetParent() As System.Web.UI.IHierarchyData Implements System.Web.UI.IHierarchyData.GetParent
Return Nothing
End Function
Public ReadOnly Property HasChildren() As Boolean Implements System.Web.UI.IHierarchyData.HasChildren
Get
Return False
End Get
End Property
Public ReadOnly Property Item() As Object Implements System.Web.UI.IHierarchyData.Item
Get
Return _data
End Get
End Property
Public ReadOnly Property Path() As String Implements System.Web.UI.IHierarchyData.Path
Get
Return _data
End Get
End Property
Public ReadOnly Property Type() As String Implements System.Web.UI.IHierarchyData.Type
Get
Return _data.GetType().ToString()
End Get
End Property
Public Overrides Function ToString() As String
Return _data
End Function
End Class
Per utilizzarlo bisogna semplicemente dichiarare il vostro controllo e scrivere il codice come nell'esempio seguente.
Non è necessario effettuare il binding con Container.Dataitem in quanto il MenuItems recupera il suo valore dall'overload IHierarchyData.ToString()
<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Menu1.DataSource = New HierarchicalData(New String() {"uno", "due", "tre"})
Menu1.DataBind()
End Sub
</script>
Tratto dal blog: http://weblogs.asp.net/dannychen/archive/2005/12/05/432382.aspx
Share on Facebook
Aggiungi a Technorati
document #N39/20051206000000 - time elapsed: 0,000 seconds