none
Riempire una dropdownlist in gridview in edititemtemplate RRS feed

  • Domanda

  • Ciao a tutti,
    ho una Gridview che contiene, in un EditItemTemplate, una gridview.
    La gridview  viene popolata staticamente: 

    <EditItemTemplate>
       <asp:DropDownList Width="250" ID="DDLUOA" Runat="server"  CssClass="form-control" 
        SelectedValue='<%# Bind("UOA") %>'>
        <asp:ListItem value="MAC">Macchine</asp:ListItem>
        <asp:ListItem value="XXX">Altro</asp:ListItem>
        </asp:DropDownList>                                          
    </EditItemTemplate>


    Quando vado in modifica, la DDL fa il bind e tutto funziona a meraviglia

    Ora però voglio che i valori della DDL vengano da un datasource. Ho provato a farlo aggiungendo questo

    codice al rowdatabound della gridview:

           Dim myDropDown As DropDownList
            If e.Row.RowType = DataControlRowType.DataRow And Not e.Row.FindControl("DDLUOA") Is Nothing Then
                myDropDown = e.Row.FindControl("DDLUOA")
                myDropDown.Items.Clear()
                ConnessioneSQL.ConnectionString = ConfigurationManager.ConnectionStrings("P10").ToString()
                ConnessioneSQL.Open()
    
                Dim Cmd As New System.Data.SqlClient.SqlCommand("Select Attività_OreUOA.codice, max(TAB_UOA.descrizione) as descrizione from Attività_OreUOA inner join tab_uoa on Attività_OreUOA.Codice=TAB_UOA.Codice  where Attività_OreUOA.siglaattività = @SIGLA group by Attività_OreUOA.codice", ConnessioneSQL)
                Cmd.Parameters.AddWithValue("@SIGLA", DDLAttività.SelectedValue)
                Dim DR As System.Data.SqlClient.SqlDataReader = Cmd.ExecuteReader
                While DR.Read()
                    myDropDown.Items.Insert(0, New ListItem(DR("Codice").ToString.Trim & " - " & DR("descrizione").ToString.Trim, DR("Codice").ToString.Trim))
                End While
    
                myDropDown.Items.Insert(0, New ListItem("Seleziona...", "Seleziona..."))
                DR.Close()
                Cmd.Parameters.Clear()
                ConnessioneSQL.Dispose()
            End If

    Qui nasce il problema.
    Il controllo non viene trovato dal findcontrol se non dopo aver fatto il bind, per cui se il valore da db
    corrisponde ad uno di quelli

    creato staticamente la ddl viene correttamente svuotata e poi popolata dei valori, altrimenti ottengo un errore sul bind

    (non trovando il selected value corretto)

    Come risolvo?

    Grazie


    Paolo





    domenica 4 luglio 2021 15:15

Tutte le risposte

  • Salve Paolo,

    Dai un'occhiata a questo video.

    Qui poi vedere esempi per la struttura del codice e qua è la documentazione ufficiale sul topic.

    Ulteriori dettagli per le data connesioni in asp.net:

    https://docs.microsoft.com/en-us/previous-versions/aspnet/ff651858(v=orm.10)

    Spero che le direzioni di sopra saranno d'aiuto.


    Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.

    lunedì 5 luglio 2021 08:37
    Moderatore
  • No, forse non mi sono spiegato bene.

    Ho un problema specifico. So come popolare una dropdownlist da DB e so come inserirla in un templatefield all'interno di una gridview (in edititemtemplate affinchè appaia in modifica)

    Il mio problema è che il bind tra il valore dato dalla SQLDatasource legata alla griddview (<%# Bind("UOA") %>)
    e il selectedvalue della DDL avviene prima che io la riempia (attualmente lo faccio del rowdatabound della gridview)

    Se aggiungo gli items della ddl in modo statico funziona: fa il bind, poi da codice individuo la ddl col findcontrol, la svuoto e la riempio coi valori da db.

    Grazie

    Paolo

    lunedì 5 luglio 2021 12:06

  •        Dim myDropDown As DropDownList
            If e.Row.RowType = DataControlRowType.DataRow And Not e.Row.FindControl("DDLUOA") Is Nothing Then
                myDropDown = e.Row.FindControl("DDLUOA")
                myDropDown.Items.Clear()
                ConnessioneSQL.ConnectionString = ConfigurationManager.ConnectionStrings("P10").ToString()
                ConnessioneSQL.Open()
    
                Dim Cmd As New System.Data.SqlClient.SqlCommand("Select Attività_OreUOA.codice, max(TAB_UOA.descrizione) as descrizione from Attività_OreUOA inner join tab_uoa on Attività_OreUOA.Codice=TAB_UOA.Codice  where Attività_OreUOA.siglaattività = @SIGLA group by Attività_OreUOA.codice", ConnessioneSQL)
                Cmd.Parameters.AddWithValue("@SIGLA", DDLAttività.SelectedValue)
                Dim DR As System.Data.SqlClient.SqlDataReader = Cmd.ExecuteReader
                While DR.Read()
                    myDropDown.Items.Insert(0, New ListItem(DR("Codice").ToString.Trim & " - " & DR("descrizione").ToString.Trim, DR("Codice").ToString.Trim))
                End While
    
                myDropDown.Items.Insert(0, New ListItem("Seleziona...", "Seleziona..."))
                DR.Close()
                Cmd.Parameters.Clear()
                ConnessioneSQL.Dispose()
            End If



    Ciao Paolo questo codice quando lo esegui?
    Ma la ddl non è uguale per ciascuna riga?


    Paolo Pranzo

    lunedì 5 luglio 2021 16:42
  • La ddl è in un TemplateField. quindi viene ripetuta in ogni riga della gridview.

    Io eseguo il codice nel rowdatabound, ho letto in diversi posti che è il posto giusto, ma il findcontrol non trova il componente prima che il bind venga eseguito e, ovviamente, il bind da errore perchè il dato presente nel campo non è ancora stato carivato tra gli items della dropdown list (quindi il selectedvalue che cerco di impostare non viene trovato)

    Se aggiungo l'item staticamente poi il bind viene eseguito e il codice trova il controllo e lo carica correttamente

    Sono sicuro si tratti di una stupidaggine, ma proprio non ci arrivo :-(

    Paolo
    lunedì 5 luglio 2021 21:51
  • Ho fatto un piccolo esempio nel mio pc di sviluppo con un semplice database access e non trovo problemi.
    Assicurati che DDLAttività.SelectedValue abbia un valore corretto.
    Altro non mi viene da suggerirti

    Paolo Pranzo

    lunedì 5 luglio 2021 23:10
  • Ti ringrazio comunque per il tempo che mi hai dedicato.

    Non è un problema di valori. E' proprio che il bind della DDL lo fa prima che il controllo sia visibile al rowdatabound e quindi i valori non sono ancora aggiunti alla DLL

     
    e.Row.FindControl("DDLUOA")
    Risulta nothing fino a che non viene fatto il bind, per cui il bind va in errore.
    Se il valore lo aggiungo staticamente invece il controllo viene trovato e gestito

    martedì 6 luglio 2021 14:18
  • Puoi postare tutto il codice della gridview e lo schema del tabella?

    Paolo Pranzo

    martedì 6 luglio 2021 15:28
  • Questa è la gridview:

     <asp:GridView ID="GVDettaglio" ShowFooter="true" DataKeyNames="idsaldettaglio"  CssClass="table table-striped" runat="server" AutoGenerateColumns="False" CellPadding="5" DataSourceID="SqlDataSourceDettaglio" ForeColor="#333333" GridLines="None" AllowSorting="True" Width="100%" PageSize="50" EmptyDataText="Nessun dettaglio presente per il sal selezionato">
                        <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                            <Columns>
                                <asp:TemplateField HeaderText="Codice UOA" SortExpression="UOA">
                                    <EditItemTemplate>
                                        <asp:DropDownList Width="250" ID="DDLUOA" 
                                            Runat="server"  CssClass="form-control" 
                                            SelectedValue='<%# Bind("UOA") %>'>
                                            <asp:ListItem value="MAC">Selezionare...</asp:ListItem>
                                            <asp:ListItem value="XXX">Selezionare...</asp:ListItem>
                                        </asp:DropDownList>                                          
                                    </EditItemTemplate>
                                    <ItemTemplate>
                                        <asp:Label ID="LabelUOA" runat="server" Text='<%# Bind("UOA") %>'></asp:Label>
                                    </ItemTemplate>
                                </asp:TemplateField>
    
                                <asp:TemplateField HeaderText="Ore" SortExpression="ORE">
                                    <EditItemTemplate>
                                        <asp:TextBox ID="TXTOre" Width="150" runat="server" CssClass="form-control" Text='<%# Bind("ore", "{0:#0}") %>'></asp:TextBox>
                                        <asp:RequiredFieldValidator runat="server"  ControlToValidate="TXTore" CssClass="text-danger" ErrorMessage="Inserire il numero di ore" />
                                    </EditItemTemplate>
                                    <ItemTemplate>
                                        <asp:Label ID="Labelore" runat="server" Text='<%# Bind("ore", "{0:#0}") %>'></asp:Label>
                                    </ItemTemplate>
                                </asp:TemplateField>
    
                                <asp:TemplateField HeaderText="ImportoUOA" SortExpression="Importo">
                                    <EditItemTemplate>
                                        <asp:TextBox ID="TXTIMportoUOA" Width="150" runat="server" CssClass="form-control" Text='<%# Bind("ImportoUOA", "{0:#0}") %>'></asp:TextBox>
                                        <asp:RequiredFieldValidator runat="server"  ControlToValidate="TXTIMportoUOA" CssClass="text-danger" ErrorMessage="Inserire l'importo" />
                                    </EditItemTemplate>
                                    <ItemTemplate>
                                        <asp:Label ID="LabelImportoUOA" runat="server" Text='<%# Bind("ImportoUOA", "{0:#0.00}") %>'></asp:Label>
                                        <ItemStyle HorizontalAlign="Right" />
                                    </ItemTemplate>
                                </asp:TemplateField>
    
    
                                <asp:TemplateField>
                                    <ItemTemplate>
                                        <asp:Button cssClass="btn btn-primary form-control" CommandName="Delete" ID="lnkElimina" runat="server"  OnClientClick="return confirm('Procedere con la cancellazione?')" Text="Elimina" />
                                    </ItemTemplate>
                                </asp:TemplateField>
    
                                <asp:TemplateField>
                                    <ItemTemplate>
                                        <asp:Button cssClass="btn btn-primary form-control" CommandName="Edit" ID="lnkmodifica" runat="server" Text="Modifica" />
                                    </ItemTemplate>
                                    <EditItemTemplate>
                                        <asp:Button ID = "SaveButton_Edit" cssClass="btn btn-primary form-control" runat = "server" CommandName = "Update" Text = "Salva" Width = "50pt" /><br /> 
                                        <asp:button ID = "CancelButton_Edit" cssClass="btn btn-primary form-control" runat = "server" CommandName = "Cancel" Text = "Annulla" Width = "50pt" />
                                    </EditItemTemplate>
                                </asp:TemplateField>
    
                            </Columns>
                            <EditRowStyle BackColor="#999999" />
                            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                            <SortedAscendingCellStyle BackColor="#E9E7E2" />
                            <SortedAscendingHeaderStyle BackColor="#506C8C" />
                            <SortedDescendingCellStyle BackColor="#FFFDF8" />
                            <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
                    </asp:GridView>
    questo il datasource (per la select command)

                SelectCommand="SELECT saldettaglio.idsaldettaglio, saldettaglio.idsal, saldettaglio.IMportoUOA,  saldettaglio.importoUOA,  saldettaglio.UOA, saldettaglio.ore from saldettaglio  WHERE saldettaglio.idsal =  @IDSAL order by saldettaglio.uoa asc"
    

    Cosi, senza null'altro funziona a patto che il valore UOA sia uno di quelli che ho messo in tabella con Additems staticamente.


    Io voglio che la dropdwonlist DDLUOA sia riempita a runtime e per questo uso il codice:

    Private Sub GVDettaglio_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GVDettaglio.RowDataBound Dim myDropDown As DropDownList If Not e.Row.FindControl("DDLUOA") Is Nothing Then myDropDown = e.Row.FindControl("DDLUOA") myDropDown.Items.Clear() ConnessioneSQL.ConnectionString = ConfigurationManager.ConnectionStrings("P10").ToString() ConnessioneSQL.Open() Dim Cmd As New System.Data.SqlClient.SqlCommand("Select Attività_OreUOA.codice, max(TAB_UOA.descrizione) as descrizione from Attività_OreUOA inner join tab_uoa on Attività_OreUOA.Codice=TAB_UOA.Codice where Attività_OreUOA.siglaattività = @SIGLA group by Attività_OreUOA.codice", ConnessioneSQL) Cmd.Parameters.AddWithValue("@SIGLA", DDLAttività.SelectedValue) Dim DR As System.Data.SqlClient.SqlDataReader = Cmd.ExecuteReader While DR.Read() myDropDown.Items.Insert(0, New ListItem(DR("Codice").ToString.Trim & " - " & DR("descrizione").ToString.Trim, DR("Codice").ToString.Trim)) End While myDropDown.Items.Insert(0, New ListItem("Seleziona...", "Seleziona...")) DR.Close() Cmd.Parameters.Clear() ConnessioneSQL.Dispose() End If

    End sub


    Grazie ancora


    mercoledì 7 luglio 2021 10:11
  • Ti aggiungo un particolare.

    Ho scritto che quando inserisco in progettazione gli items della ddl tutto funziona perfettamente, ma non è vero perchè in effetti in modifica il selectedvalue non è quello giusto, la ddl si imposta sul "Selezionare..." che è il suo valore di default.
    Mi sembra una conferma che il bind avvenga prima....

    mercoledì 7 luglio 2021 11:07