asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 12546
ASPCode.it - Store

  > > Articoli

Annidare Server Control

Data di pubblicazione: 29/04/2003        Voto della community: 3,17 (Votanti: 2)


Uno scenario comune nella visualizzazione di dati ripetitivi puo' essere di questo tipo:

Nome Categoria
Prodotto 1
Prodotto 2
Prodotto 3

Si ripetono i nomi delle varie categorie e, sotto ciascuno di essi, i vari prodotti di quella particolare categoria. In ASP classico, vi erano varie maniere per fare cio'; fra queste l'approccio più comune sarebbe un ciclo For/Next all'interno di un Recordset.

Ora, con l'avvento di ASP.Net, possiamo intelligentemente annidare (nesting) i controlli per la ripetizione (DataList, Repeater) per fare ciò. Bisogna riconoscere che tale tecnica, anche se si ha un po' di pratica coi database relazionali, puo' inizialmente 'intimidire', ma una volta compresa appieno, sembrerà perfettamente logica.

In questo articolo, useremo un controllo Datalist, l'SQL Managed Provider e il database Northwind (tabelle Categorie e Prodotti). Volendo, avremmo potuto usare facilmente un controllo Repeater per una diversa formattazione dei dati. Ecco i passi per produrre questo scenario:

Nell'HTML:

1. Creiamo/istanziamo un controllo DataList (assegniamoli come ID=dlCategories), con un ItemTemplate Container.DataItem=CategoryName

2. All'interno dell'ItemTemplate, creiamo/istanziamo un'altro controllo DataList, con un ItemTemplate Container.DataItem=ProductName. La differenza qui è che usiamo come DataSource '<%#Container.DataItem.Row.GetChildRows("myrelation")%>'. Per il momento non preoccupiamoci del significato, sarà chiaro più avanti.

Nella sezione del codice:

1.Costruiamo un normale scenario Database/DataSet (Connection/DataAdapter/DataSet)

Dim strConn as String = "Server=(local);uid=sa;pwd=PWD;database=Northwind"
Dim MySQL as string = "Select CategoryID, CategoryName from Categories"
Dim MyConn as New SQLConnection(strConn)
Dim ds as DataSet=New DataSet()

2. Creiamo un oggetto Command per popolare il DataSet con le Categorie (basato sull'SQL del DataAdapter)

Dim Cmd as New SQLDataAdapter(MySQL,MyConn)
Cmd.Fill(ds,"Categories")

3. Ora aggiungiamo un secondo Command per visualizzare i prodotti per ciascuna categoria

Dim cmd2 As SqlDataAdapter = New SqlDataAdapter("select * from Products", MyConn)
cmd2.Fill(ds, "Products")

4. Questa è la parte cruciale. Creiamo una relazione (Relation) (pensiamo alla relazione PrimaryKey/ForeignKey che sarebbe necessaria nella struttura del database per questo scenario). Ecco come funziona!!

ds.Relations.Add("myrelation", _
ds.Tables("Categories").Columns("CategoryID"), _
ds.Tables("Products").Columns("CategoryID")) 

5. Infine, eseguiamo il DataBind

dlCategories.Datasource=ds.Tables("NWCategories").DefaultView
DataBind()
MyConn.Close


Come potete vedere, la parte più ardua è svolta dalla sezione che aggiunge la relazione fra i due DataList. Niente male, no?
Di seguito riportiamo il codice completo.

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQLClient" %>
<html>
<head>
<meta name="GENERATOR" Content="ASP Express 2.1">
<title>Nested DataLists</title>
<script language="VB" runat="server">
Sub Page_Load(Source as Object, E as EventArgs)
Dim strConn as string = "server=YourServer;uid=UID;pwd=PWD;database=Northwind"
Dim MySQL as string = "Select CategoryID, CategoryName from Categories"
Dim MyConn as New SQLConnection(strConn)
Dim ds as DataSet=New DataSet()

Dim Cmd as New SQLDataAdapter(MySQL,MyConn)
Cmd.Fill(ds,"Categories")

        Dim cmd2 As SqlDataAdapter = New SqlDataAdapter("select * from Products", MyConn)
        cmd2.Fill(ds, "Products")

        ds.Relations.Add("myrelation", ds.Tables("Categories").Columns("CategoryID"), ds.Tables("Products").Columns("CategoryID"))

dlCategories.Datasource=ds.Tables("Categories").DefaultView
DataBind()
End Sub
</script>
</head>
<body>
<asp:DataList runat="server"
        Id="dlCategories"
      GridLines="Both"
        Bordercolor="black"
        cellpadding="3"
        cellspacing="0"
        Headerstyle-BackColor="#DDDDDD"
        Headerstyle-Forecolor="#777777"
        Headerstyle-Font-Name="Arial"
        Headerstyle-Font-Size="14"
        Headerstyle-Font-Bold="true"
        Font-Name="Arial"
        Font-Bold="true"
        Font-Italic="true"
        Font-Size="11"
        ForeColor="Red"
        RepeatColumns="1">
        <HeaderTemplate>
                Categories & Products
        </HeaderTemplate>
        <ItemTemplate><%# Container.DataItem("CategoryName")%>
                <br>
                          <asp:DataList runat="server"
                                Id="ChildDataList"
                                GridLines="None"
                                Bordercolor="black"
                                cellpadding="3"
                                cellspacing="0"
                                Headerstyle-BackColor="#8080C0"
                                Headerstyle-Font-Name="Arial"
                                Headerstyle-Font-Size="8"
                                Font-Name="Arial"
                                Font-Size="8"
                                datasource='<%# Container.DataItem.Row.GetChildRows("myrelation") %>'
                                RepeatColumns="3">
                                <ItemTemplate>
                                        &nbsp; &nbsp; <%# Container.DataItem("ProductName") %>
                                </ItemTemplate>
                          </ASP:DataList>
        </ItemTemplate>
</ASP:DataList>
</body>
</html>


Si ringrazia aspnet101.com per la gentile concessione dell'articolo (Nesting Server Controls, lingua inglese)




Utenti connessi: 12546