Visualizzazione dei risultati da 1 a 5 su 5

Discussione: repeater - pafre/figli

  1. #1

    repeater - padre/figli

    Vorrei mostrare a video il titolo del mio album (che fa parte di una tabella album) e le canzoni in esso contenute (che sono dentro ad una tabella testi). Le due tabelle sono legate tra loro da una relazione uno a molti.

    Usando il codice qui sotto ci riesco, ma non mi piace dal punto di vista formale, visto che la formattazione del risultato avviene nella parte dove scrivo il codice.
    Ho provato a fare la stessa cosa usando un repeater ma non ci sono riuscito. Se inserisco il titolo dell'album all'interno di un <ItemTemplate> mi viene ripetuto più volte, mentre a me serve una sola volta. Provando con due <repeater> annidati mi da errore...
    Qual'è il modo migliore di procedere per realizzare il codice qui sotto con i repeater?
    Grazie


    Marco

    codice:
    Sub Page_load
    Dim objConn As OleDbConnection
    Dim cmdSelect As OleDbCommand
    Dim strSql As string
    Dim dtrAlbum As OleDbDataReader
    Dim id As integer
    
    objConn=New OleDbConnection("PROVIDER=Microsoft.Jet.OleDb.4.0;Data Source="&Server.MapPath("../discografia.mdb"))
    strSql="SELECT album.*,testi.* FROM album,testi WHERE album.id=1 AND testi.id=album.id ORDER BY testi.numeroTraccia ASC"
    cmdSelect=New OleDbCommand(strSql,objConn)
    objConn.Open
    dtrAlbum=cmdSelect.ExecuteReader()
    while dtrAlbum.read() 
    titolo.text=dtrAlbum("TitoloAlbum")
    canzone.text+=dtrAlbum("numeroTraccia")&" "&dtrAlbum("TitoloCanzone")&"
    "
    end while
    dtrAlbum.Close
    objConn.Close
    end sub

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Uno dei varii modi è quello di utilizzare due repeater annidati.
    1) il repeater più esterno è quello dei padri. Nell'<ItemTemplate> annidi il repeater dei figli impostando la proprietà DataSource con una funzione che ha come parametro la chiave di collegamento delle due tabelle, e come risultato, per esempio, un datatable:
    Per esempio (repeater annidato) (nel mio caso voglio vedere i comuni per una data provincia):
    codice:
    <asp:Repeater id="Repeater2" Runat="server" DataSource='<%#Calcola(DataBinder.Eval(Container.DataItem, "ID_PROVINCIA"))%>' EnableViewState="false">
    la funzione Calcola sarà per esempio:
    codice:
        Function Calcola(ByVal id_provincia As Integer) As DataTable
            Return GetDataTable(StringaConnessione, String.Format("SELECT * FROM COMUNI WHERE ID_PROVINCIA = {0} ORDER BY NOME_COMUNE", id_provincia))
        End Function

  3. #3
    Ho risolto in questa maniera basandomi su questo esempio:
    http://support.microsoft.com/default...b;en-us;326338
    codice:
    <%@ Page Language="VB" Debug="true" %>
    <%@ import namespace="System.Data.OleDb"%>
    <%@ import namespace="System.Data"%>
    <script runat="server">
    Sub Page_load
    'Dichiaro le variabili
    Dim cnn As OleDbConnection
    Dim cmdSelect As OleDbCommand
    Dim strSql As string
    Dim dtrAlbum As OleDbDataReader
    
    'Creo un nuovo DataSet
    Dim ds As DataSet = New DataSet()
    
    'creo una nuova connessione
    cnn=New OleDbConnection("PROVIDER=Microsoft.Jet.OleDb.4.0;Data Source="&Server.MapPath("../discografia.mdb"))
    
    'Creo un DataAdapter per selezionare i valori della categoria "padre"
    Dim cmd1 As OleDbDataAdapter = New OleDbDataAdapter("select * from album where id=1", cnn)
    
    'Creo un DataAdapter per selezionare tutti i valori dei figli
    Dim cmd2 as OleDbDataAdapter = New OleDbDataAdapter("select * from testi where id=1 order by numeroTraccia ASC", cnn)
    
    'Apro la connessione
    cnn.Open
    
    'riempio le tabelle album e testi
    cmd1.Fill(ds, "album")
    
    cmd2.Fill(ds, "testi")
    
    'Stabilisco una relazione padre/figlio tra le due tabelle album e testi (hanno in comune la colonna ID)
    ds.Relations.Add("myrelation", _
    ds.Tables("album").Columns("id"), _
    ds.Tables("testi").Columns("id"))
    
    'Assegno al repeater padre il dataSet Album
    parentRepeater.DataSource = ds.Tables("album")
    
    'effettuo il collegamento delle risorse
    Page.DataBind()
    
    'chiudo la connessione
    cnn.Close()
    
    end sub
    </script>
    <html>
    <head>
    <title>Untitled Document</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    </head>
    <body>
    <form runat="server">
    <asp:repeater id="parentRepeater" runat="server">
    <itemtemplate>
    <h3><%# Container.DataItem("titoloAlbum")%></h3>
    
    <asp:repeater id="childRepeater" datasource='<%# Container.DataItem.Row.GetChildRows("myrelation") %>' runat="server">
    		<itemtemplate>
    	            <%# Container.DataItem("titoloCanzone") %>
    		    
    
    		</itemtemplate>
    </asp:repeater>
    </itemtemplate>
    </asp:repeater>
    </form>
    </body>
    </html>
    L'unica parte poco chiara e questa:
    codice:
    <asp:repeater id="childRepeater" datasource='<%# Container.DataItem.Row.GetChildRows("myrelation") %>' runat="server">
    		<itemtemplate>
    	            <%# Container.DataItem("titoloCanzone") %>
    		    
    
    		</itemtemplate>
    </asp:repeater>
    Il repeater figlio viene collegato alle righe del dataSet figlio che ho dichiatato nella relazione "myrelation" è corretta come interpretazione? Chi potrebbe chiarirmi questo passaggio?

    Il metodo che mi hai proposto purtroppo non sono riuscito a capirlo, probabilmente perchè non era completo o per mia incapacità.

    Scusate il post lungo, ma credo sia interessante verificare le varie possibili soluzioni a questo problema.



    Marco

  4. #4
    Ho dovuto fare una cosa simile e ho utilizzato il seguente controllo:

    http://www.denisbauer.com/ASPNETCont...ierarGrid.aspx

    E' fatto bene e semplice da utilizzare.
    Michela

  5. #5
    Grazie dell'esempio...Più che altro a me interessava capire a fondo quella riga di codice che ho evidenziato ed eventuali altri metodi per risolvere il problema...a titolo di studio...
    Ciao


    Marco

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.