37 messaggi dal 06 settembre 2002
ciao alla comunità
premetto che non sono esperto di asp.net ma ho fatto solo alcune cose saltuarie per diletto

avrei bisogno di creare una gridview gerarchica nel senso che mi piacerebbe avere una gridview dove all'inizio di ogni riga della grid ci sia un bottoncino tipo (+) che se cliccato aprisse sotto la riga della gridview un altra grid view collegata con dei valori collegati alla chiave della riga della grid

ho visto qualcosa del genere fatto con un controllo non standard mi sembra ultragridview e mi domandavo se era possibile farlo anche con lo standard

grazie a tutti

ciao

zanza67
492 messaggi dal 08 gennaio 2007
Ciao, non credo che sia proprio un compito banale, e immagino ci siano tanti modi per realizzare quello che chiedi, potresti ad esempio aggiungere una colonna al GridView principale e aggiungere un pulsante alla cui pressione rende visibile un div, con z-order superiore a quello principale, che contenga al suo interno un secondo GridView, naturalmente il binding del secondo GridView lo farai solo dopo la pressione del pulsante così da poter recuperare la chiave della riga dalla quale far partire la seconda query e implementare il lazy load, ovvero, il caricamento dei dati secondario non avviene per tutte le righe del GridView , cosa che sarebbe pesante e inutile, ma solo per la riga interessata.
37 messaggi dal 06 settembre 2002
ciao

potresti scrivermi una traccia del codice
sono agli inizi e non riesco a seguirti a parole

grazie

ciao
492 messaggi dal 08 gennaio 2007
Ciao, ho provato a metter giù qualcosa, ma come mi aspettavo non mi è stato così facile raggiungere quello che volevi, comunque è un inizio e magari gli altri ragazzi quando avranno tempo di indirizzeranno meglio:
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" 
            onrowcommand="GridView1_RowCommand">
            <Columns>
                <asp:TemplateField ShowHeader="False">
                    <ItemTemplate>
                        <asp:Button ID="Button1" runat="server" CausesValidation="False" 
                            CommandArgument='<%# Eval("IDLibrary") %>' 
                            Text="Button" />
                            <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" 
                                DataKeyNames="IDBook" DataSourceID="SqlDataSource1">
                                <Columns>
                                    <asp:BoundField DataField="IDBook" HeaderText="IDBook" InsertVisible="False" 
                                        ReadOnly="True" SortExpression="IDBook" />
                                    <asp:BoundField DataField="IdLibrary" HeaderText="IdLibrary" 
                                        SortExpression="IdLibrary" />
                                    <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                                    <asp:BoundField DataField="Author" HeaderText="Author" 
                                        SortExpression="Author" />
                                </Columns>
                            </asp:GridView>
                        <br />
                        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                            ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
                            SelectCommand="SELECT * FROM [Book] WHERE ([IdLibrary] = @IdLibrary)">
                            <SelectParameters>
                                <asp:ControlParameter ControlID="Button1" Name="IdLibrary" 
                                    PropertyName="CommandArgument" Type="Int32" />
                            </SelectParameters>
                        </asp:SqlDataSource>
                        <br />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
            SelectCommand="SELECT * FROM [Library]"></asp:SqlDataSource>


In sintesi, ho fatto 2 tabelle, una per le librerie e una per i libri, con una relazione 1 libreria per molti libri, ho aggiunto un template alla prima gridView. Vi ho inserito un button con il command argument bindato con il campo IDlibreria, e un secondo gridview e relativo datasource che fa la seconda query e che come parametro il commandargument del button. Naturalmente in questo caso al caricamento della prima GridView c'è il caricamento totale di tutti i dati, e la visualizzazione di tutte le grid secondarie, cosa che non va bene, la soluzione potrebbe essere quella di fare il bind della seconda gridView via codice allo scatenarsi dell'evento rowcommand. Se favoleggio correggetemi, grazie
492 messaggi dal 08 gennaio 2007
Questo funziona meglio, si dovrebbe "fixare" un incompatibilità tra le regole css tra IE e Firefox...
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MyGridViewWithGridDetail.ascx.cs"
    Inherits="MyGridViewWithGridDetail" %>
<div id="GV1Div" runat="server">
    <div style="margin:0 0;">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="IDLibrary"
            DataSourceID="SqlDataSource1" BackColor="White" BorderColor="#DEDFDE" BorderStyle="Solid"
            BorderWidth="1px" CellPadding="4" GridLines="Vertical" OnSelectedIndexChanging="GridView1_SelectedIndexChanging"
            ForeColor="Black">
            <FooterStyle BackColor="#CCCC99" />
            <RowStyle BackColor="#F7F7DE" Font-Names="Verdana" Font-Size="10pt" Height="25px" />
            <Columns>
                <asp:TemplateField ShowHeader="False">
                    <ItemTemplate>
                        <asp:Button ID="Button1" runat="server" CausesValidation="False" CommandArgument='<%# Eval("IDLibrary") %>'
                            CommandName="Select" Text="+" Font-Size="10px" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="IDLibrary" HeaderText="IDLibrary" InsertVisible="False"
                    ReadOnly="True" SortExpression="IDLibrary" />
                <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
                <asp:BoundField DataField="Adress" HeaderText="Adress" SortExpression="Adress" />
            </Columns>
            <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
            <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" Font-Names="Verdana"
                Font-Size="10pt" Height="25px" />
            <AlternatingRowStyle BackColor="White" />
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
            SelectCommand="SELECT * FROM [Library]"></asp:SqlDataSource>
    </div>
    <div id="GV2Div" runat="server">
        <asp:GridView ID="GridView2" runat="server" BackColor="White" BorderColor="#DEDFDE"
            BorderStyle="Solid" BorderWidth="1px" CellPadding="4" ForeColor="Black" GridLines="Vertical">
            <FooterStyle BackColor="#CCCC99" />
            <RowStyle BackColor="#F7F7DE" />
            <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
            <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
            <AlternatingRowStyle BackColor="White" />
        </asp:GridView>
    </div>
</div>






protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
        DataClassesDataContext db = new DataClassesDataContext();
        GridView gv = (GridView)sender;
        Button btn = (Button)gv.Rows[e.NewSelectedIndex].Cells[0].FindControl("button1");
        int bca = int.Parse(btn.CommandArgument);
        var clt = from c in db.Books where c.IdLibrary == bca select c;
        GridView2.DataSource = clt;
        GridView2.DataBind();
        GV2Div.Style.Add(HtmlTextWriterStyle.Position, "absolute");
        GV2Div.Style.Add(HtmlTextWriterStyle.BackgroundColor, "White");
        int rowSh = Convert.ToInt32(GridView1.RowStyle.Height.Value);
        int rowHh = Convert.ToInt32(GridView1.HeaderStyle.Height.Value);
        GV2Div.Style.Add(HtmlTextWriterStyle.Top, String.Format("{0}px", (rowSh * e.NewSelectedIndex) + rowHh * 2));
        GV2Div.Style.Add(HtmlTextWriterStyle.Left, "75px");
    }

Non è perfetto, ma fa il suo sporco lavoro
37 messaggi dal 06 settembre 2002
grazie mille

faccio la prova e ti faccio sapere

ciao

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.