[Torna Indietro]
[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

Articoli Tecnici - Fonte: NewTec 2000
Share on Facebook Aggiungi a Technorati
document #N39/20051206000000 - time elapsed: 0,000 seconds