Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Gridview DENTRO un gridview

    Salve a tutti,
    volevi chiedervi un piccolo aiuto su una cosa sulla quale mi sto scervellando da giorni. :master:

    Ho un gridview (chiamiamolo gridviewA) popolato da DB e nel quale ho inserito in una nuova colonna un campo ItemTemplate.

    In questo campo template ho inserito quindi un SECONDO gridview (chiamiamolo gridviewB), nel quale voglio far visualizzare tutte le immagini del record.

    In pratica il gridviewA legge la Tabella "News", mentre il gridviewB legge la Tabella "ImmaginiNews" che contiene tutte le immagini di ogni singola news. La chiave esterna che collega le due Tabelle e' "ID_News".

    Quello che non riesco a fare e' come passare questa chiave dalla gridviewA alla gridviewB, cioe' nella query di estrazione della gridviewB dovrei passare in sostanza l'ID_News che e' l'indice di riga della gridviewA: "SELECT * FROM ImmaginiNews WHERE ID_News = ?"

    Spero di essere stato chiaro. Se necessario vi posto il codice, per ora non l'ho fatto perche' e' molto lungo (una gridview con un'altra gridview dentro conta molte righe di codice).

    Grazie mille come sempre per il supporto.

    Il mio ultimo libro:
    Giorni di Follia. Presenze inquietanti a Pescara.
    www.giornidifollia.it

  2. #2
    questo è il classico contesto master-detail, che purtroppo non è supportato nativamente dal controllo GridView. Ci sono molti controlli "grid" commerciali che colmano a questa mancanza, ma non sono free.. (io utilizzo talvolta Telerik RadGrid).

    per qualche workaround al tuo problema, puoi dare un'occhiata a questo articolo
    Davide

  3. #3
    Grazie infinite per il tuo suggerimento!

    Devo dire che la vedo dura! Ho letto gli articoli che mi hai suggerito ma.. come dire.. credo di doverli rileggere per cavarci qualcosa!

    Nel frattempo mi cheidevo se avevi un "metodo alternativo" da suggerirmi per visualizzare un record e tutte le immagini ad esso associate. Non so come affrontare diversamente il problema: mi veniva in mente di inserire nell'ItemTemplate non un secondo GridView ma un Pannello da popolare con le immagini tramite magari una apposta funzione... ma non so valutare a priori se mi troverei ancora lo stesso problema del passaggio della chiave... mha!

    Grazie ancora.

    Il mio ultimo libro:
    Giorni di Follia. Presenze inquietanti a Pescara.
    www.giornidifollia.it

  4. #4
    volendo utilizzare il databinding potresti mettere nel ItemTemplate un controllo repeater da popolare al volo, al datasource del repeater passi la FK da utilizzare..
    Davide

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    ti mando un esempio completo, del tipo Regioni-Province.
    Vi è un Gridview che lista le regioni. Una colonna contiene una iconcina. Cliccandoci sopra si espande e fa vedere le province per quella data regione.
    Io avrei usato un repeater, ma quello che conta è il principio di funzionamento

    codice:
    <%@ Page Language="VB" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
            If Not Me.IsPostBack Then
                BindData()
            End If
        End Sub
        
        Private Sub BindData()
    
            Dim connessione As OleDbConnection = Nothing
            
            Try
                'creo e apro la connessione
                connessione = New OleDbConnection(StringaConnessioneTest)
                connessione.Open()
                
                'le due istruzioni sql, regioni, province
                Dim sql1 As String = "SELECT * FROM REGIONI ORDER BY NOME_REGIONE"
                Dim sql2 As String = "SELECT * FROM Q_PROVINCIE ORDER BY NOME_PROVINCIA"
                
                'creo il dataset
                Dim ds As New DataSet()
                
                'aggiungo la tabella regioni al dataset
                Dim dt As DataTable = libreria.GetDataTable(connessione, sql1)
                dt.TableName = "regioni"
                ds.Merge(dt.DataSet)
    
                
                'aggiungo la tabella province al dataset
                dt = libreria.GetDataTable(connessione, sql2)
                dt.TableName = "province"
                ds.Merge(dt.DataSet)
                
                'relazione che lega le due tabelle
                ds.Relations.Add("provincie_regioni", ds.Tables("regioni").Columns("codice_istat_regione"), ds.Tables("province").Columns("codice_istat_regione"))
    
                Me.GridViewParent.DataSource = ds.Tables("regioni")
                Me.GridViewParent.DataBind()
                
                
            Catch ex As Exception
                Me.Label1.Text = ex.Message()
            Finally
                If Not connessione Is Nothing Then connessione.Close()
            End Try
        End Sub
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Pagina senza titolo</title>
        <link href="../../../../stili/Styles.css" rel="stylesheet" type="text/css" />
    
        <script language="javascript" type="text/javascript">
    // <!CDATA[
    function dettagli(v)
    {
    	var img_id = v.id;
    	var div_id = "div" + v.id.substr(3);
    	var div = document.getElementById(div_id);
    	if(div.style.display == "")
    	{
    		div.style.display = "none";
    		v.src = "/ArchivioEsempi2/immagini/piu.gif";
    	}
    	else
    	{
    		div.style.display = "";
    		v.src = "/ArchivioEsempi2/immagini/meno.gif";
    	}
    }
    
    
    // ]]>
        </script>
    
    </head>
    <body>
        <form id="form1" runat="server">
            <h3>GridView dentro GridView con GetChildRows</h3>
            <asp:Label ID="Label1" runat="server" Text="" EnableViewState="false"></asp:Label>
            <div>
                <asp:GridView ID="GridViewParent" runat="server" EnableViewState="false" AutoGenerateColumns="false" BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px" BackColor="White" CellPadding="4">
                    <SelectedRowStyle Font-Bold="True" ForeColor="#663399" BackColor="#FFCC66"></SelectedRowStyle>
    				<RowStyle ForeColor="#330099" BackColor="White"></RowStyle>
    				<HeaderStyle Font-Bold="True" ForeColor="#FFFFCC" BackColor="#990000"></HeaderStyle>
                
                    <Columns>
                        <asp:BoundField HeaderText="Regione" DataField="nome_regione" ItemStyle-VerticalAlign="Top" />
                        <asp:TemplateField HeaderText="Province" >
                            <ItemTemplate>
                                [img]/ArchivioEsempi2/immagini/piu.gif[/img]' style="margin:0px;"/>
                                <div id='div_<%# DataBinder.Eval(Container.DataItem, "CODICE_ISTAT_REGIONE")%>' style="display:none;">
                                    <asp:GridView ID="GridViewChild" runat="server" EnableViewState="false" AutoGenerateColumns="false" DataSource='<%#directcast(Container.DataItem, system.Data.DataRowView).Row.GetChildRows("provincie_regioni")%>' ShowHeader="false" BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px" BackColor="White" CellPadding="4" style="width:100%;">
    					                <SelectedRowStyle Font-Bold="True" ForeColor="#CCFF99" BackColor="#009999"></SelectedRowStyle>
    					                <RowStyle ForeColor="#003399" BackColor="White"></RowStyle>
    					                <HeaderStyle Font-Bold="True" ForeColor="#CCCCFF" BackColor="#003399"></HeaderStyle>
    
                                        <Columns>
                                            <asp:TemplateField>
                                                <ItemTemplate>
                                                    <%#DirectCast(Container.DataItem, System.Data.DataRow)("NOME_PROVINCIA")%>
                                                </ItemTemplate>
                                            </asp:TemplateField>
                                            
                                        </Columns>
                                    </asp:GridView> 
                                </div>                           
                            </ItemTemplate>
                            
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
            </div>
        </form>
    </body>
    </html>

    codice:
        '-------------------------------------------------------------------------------------
        'Restituisce un oggetto DataTable o lancia eccezione in caso di errore
        'parametri: connessione, stringa sql
        '-------------------------------------------------------------------------------------
        Public Function GetDataTable(ByVal Connessione As OleDbConnection, ByVal stringaSQL$) As DataTable
    
            Try
                'creo un nuovo DataAdapter
                Dim DataAdapter As New OleDbDataAdapter(stringaSQL, Connessione)
    
                'creo un DataSet e lo riempio con i dati
                Dim DataSet As New DataSet
                DataAdapter.FillSchema(DataSet, SchemaType.Source)
                DataAdapter.Fill(DataSet, "sql")
    
                Return DataSet.Tables("sql")
    
            Catch Errore As Exception
                Throw
                Return Nothing
            End Try
    
    
        End Function

    ps. ci sono altri modi: quello che preferisco è non usare il gridview e compormi la tabella da codice, con stringbuilder.
    Pietro

  6. #6
    GRAZIE Pietro!!
    Gentilissimo (come sempre).

    In effetti farsi tutto da codice e' anche per me la scelta migliore, ma quando hai dei componenti gia' pronti (e belli succulenti ) come i GridView ti abitui male e ti scervelli per adattarli alle tue esigenze.

    Grazie ancora, mi studio il tuo codice.

    Il mio ultimo libro:
    Giorni di Follia. Presenze inquietanti a Pescara.
    www.giornidifollia.it

  7. #7
    Ragazzi sebbene usare i Repeater annidati dentro i GridView è abbastanza semplice e funzionale, ho voluto provare ad usare anche i GridView annidati e alla fine ci sono riuscito.

    Per dovere di cronaca vi posto il link trovato si internet a cui mi sono ispirato, magari può tornare utile a qualcuno, anche perchè prescinde dall'uso dei DataSet:

    http://www.kellytadams.com/mt-archives/000263.html

    Grazie a tutti. CIao.
    Igor
    Il mio ultimo libro:
    Giorni di Follia. Presenze inquietanti a Pescara.
    www.giornidifollia.it

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.