52 messaggi dal 13 marzo 2002
Salve,

nell'EditItemTemplate di una gridview ho due dropdownlist in cascata.

Se provo a cambiare la selezione della prima dropdownlist si ha l'errore:

I metodi di associazione dati come Eval(), XPath() e Bind() possono essere utilizzati solo nel contesto di un controllo con associazione a dati.

Qualche idea per risolverlo?

Grazie
Umberto
Mi sa che chiami uno di quei metodi nel SelectedIndexChanged della prima ddl ma quelli sono disponibili solo in fase di binding del gridview. Dopo il postback la sorgente originale che hai caricato non è più disponibile. Ricarica i dati sul momento per caricare la ddl2.
Almeno se ho capito giusto cosa hai fatto...

Ciao

Il mio blog
Homepage
52 messaggi dal 13 marzo 2002
Posto il codice:

<asp:GridView ID="GVArticoli" runat="server" AutoGenerateColumns="False" BackColor="White"
BorderColor="#336666" BorderStyle="Double" BorderWidth="3px" CellPadding="4"
DataKeyNames="IDArticolo" DataSourceID="DSArticoli" GridLines="Horizontal" Visible="False" OnDataBound="GVArticoli_DataBound">
<FooterStyle BackColor="White" ForeColor="#333333" />
<Columns>
<asp:TemplateField HeaderText="IDArticolo" SortExpression="IDArticolo">
<EditItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("IDArticolo") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("IDArticolo") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:BoundField DataField="IDImg" HeaderText="IDImg" SortExpression="IDImg" Visible="False" />
<asp:TemplateField HeaderText="Cod. Serie" SortExpression="Cser">
<EditItemTemplate>
<asp:SqlDataSource ID="DSCser" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionSQL %>"
SelectCommand="GAListaCser" SelectCommandType="StoredProcedure"></asp:SqlDataSource>
<asp:DropDownList ID="ddlCser" runat="server" AutoPostBack="True" DataSourceID="DSCser" DataTextField="cser" DataValueField="cser" AppendDataBoundItems="True" SelectedValue='<%# Bind("Cser") %>'>
</asp:DropDownList>
</EditItemTemplate>
<HeaderStyle Wrap="False" />
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Cser") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp; &nbsp;&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Cod. Art." SortExpression="Cart">
<EditItemTemplate>
<asp:SqlDataSource ID="DSCart" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionSQL %>" SelectCommand="GAListaCart" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:ControlParameter ControlID="ddlCser" Name="Cser_sel" PropertyName="SelectedValue"
Type="String" />
</SelectParameters>
</asp:SqlDataSource>
<asp:DropDownList ID="ddlCart" runat="server" AutoPostBack="True" AppendDataBoundItems="True" DataSourceID="DSCart" DataTextField="cart" DataValueField="cart" SelectedValue='<%# Bind("Cart") %>'>
</asp:DropDownList>
</EditItemTemplate>
<HeaderStyle Wrap="False" />
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Cart") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Code" HeaderText="Code" SortExpression="Code" Visible="False" />
<asp:TemplateField HeaderText="Descrizione" SortExpression="DesArticolo">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("DesArticolo") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("DesArticolo") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Prezzo" HeaderText="Prezzo" SortExpression="Prezzo" ReadOnly="True" />
<asp:TemplateField HeaderText="Misure" SortExpression="Misure">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Misure") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label5" runat="server" Text='<%# Bind("Misure") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Quantit&#224;" SortExpression="Quantita">
<EditItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("Quantita") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label6" runat="server" Text='<%# Bind("Quantita") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Tipo Gest." SortExpression="tg">
<FooterTemplate>
&nbsp;
</FooterTemplate>
<ItemStyle Wrap="False" />
<HeaderStyle Wrap="False" />
<ItemTemplate>
<asp:Label ID="Label7" runat="server" Text='<%# Bind("tg") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowSelectButton="True" />
</Columns>
<RowStyle BackColor="White" ForeColor="#333333" Font-Names="Tahoma" Font-Size="10pt" />
<SelectedRowStyle BackColor="#339966" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#336666" ForeColor="White" HorizontalAlign="Center" />
<HeaderStyle BackColor="#336666" Font-Bold="True" ForeColor="White" />
</asp:GridView>


In realtà non sto chiamando niente nel SelectedIndexChanged.
Forse devo ricaricare la ddl2 sull'evento databinding del ddl1.
Ma come si fa? Hai un esempio?
Ok, ora è chiaro.
Quando usi un datasource con uno o più parametri il motore ad ogni postback monitorizza i loro valori. Se cambiano richiede il databind di tutti i controlli che stanno usando quel datasource. Quando tu usi la sintassi <%# stai dicendo che in fase di databind della riga / controllo / dropdownlist deve fare associare un certo valore. Se la sorgente come ti ho detto prima si invalida parte di nuovo il <%# della seconda ddl che cerca di usare Bind, metodo utilizzabile solo se stai ribindando la sorgente principale del gridview, cosa che in quel momento non stai facendo.
Quindi sostituisci l'assegnazione così:
SelectedValue='<%#((DropDownList)((GridViewRow)Container).FindControl("ddl1")).SelectedValue %>' 


Così ti vai a cercare il valore della ddl1 e non il valore di quella riga.

Ciao

Il mio blog
Homepage
52 messaggi dal 13 marzo 2002
Ricciolo,

ho sostituito il SelectedValue della ddl2 con quello che mi hai suggerito, ma ora si ha l'errore:

SelectedValue in 'ddlCart' non valido, poiché non è incluso nell'elenco di elementi.
Nome parametro: value
52 messaggi dal 13 marzo 2002
<asp:GridView ID="GVArticoli" runat="server" AutoGenerateColumns="False" BackColor="White"
BorderColor="#336666" BorderStyle="Double" BorderWidth="3px" CellPadding="4"
DataKeyNames="IDArticolo" DataSourceID="DSArticoli" GridLines="Horizontal" Visible="False" OnDataBound="GVArticoli_DataBound">
<FooterStyle BackColor="White" ForeColor="#333333" />
<Columns>
<asp:TemplateField HeaderText="IDArticolo" SortExpression="IDArticolo">
<EditItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("IDArticolo") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("IDArticolo") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:BoundField DataField="IDImg" HeaderText="IDImg" SortExpression="IDImg" Visible="False" />
<asp:TemplateField HeaderText="Cod. Serie" SortExpression="Cser">
<EditItemTemplate>
<asp:SqlDataSource ID="DSCser" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionSQL %>"
SelectCommand="GAListaCser" SelectCommandType="StoredProcedure"></asp:SqlDataSource>
<asp:DropDownList ID="ddlCser" runat="server" AutoPostBack="True" DataSourceID="DSCser" DataTextField="cser" DataValueField="cser" AppendDataBoundItems="True" SelectedValue='<%# Bind("Cser") %>'>
</asp:DropDownList>
</EditItemTemplate>
<HeaderStyle Wrap="False" />
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Cser") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp; &nbsp;&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Cod. Art." SortExpression="Cart">
<EditItemTemplate>
<asp:SqlDataSource ID="DSCart" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionSQL %>" SelectCommand="GAListaCart" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:ControlParameter ControlID="ddlCser" Name="Cser_sel" PropertyName="SelectedValue"
Type="String" />
</SelectParameters>
</asp:SqlDataSource>
<asp:DropDownList ID="ddlCart" runat="server" AutoPostBack="True" AppendDataBoundItems="True" DataSourceID="DSCart" DataTextField="cart" DataValueField="cart" SelectedValue='<%# ((DropDownList)((GridViewRow)Container).FindControl("ddlCser")).SelectedValue %>'>
</asp:DropDownList>
</EditItemTemplate>
<HeaderStyle Wrap="False" />
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Cart") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Code" HeaderText="Code" SortExpression="Code" Visible="False" />
<asp:TemplateField HeaderText="Descrizione" SortExpression="DesArticolo">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("DesArticolo") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("DesArticolo") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Prezzo" HeaderText="Prezzo" SortExpression="Prezzo" ReadOnly="True" />
<asp:TemplateField HeaderText="Misure" SortExpression="Misure">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Misure") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label5" runat="server" Text='<%# Bind("Misure") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Quantit&#224;" SortExpression="Quantita">
<EditItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("Quantita") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label6" runat="server" Text='<%# Bind("Quantita") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
&nbsp;
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Tipo Gest." SortExpression="tg">
<FooterTemplate>
&nbsp;
</FooterTemplate>
<ItemStyle Wrap="False" />
<HeaderStyle Wrap="False" />
<ItemTemplate>
<asp:Label ID="Label7" runat="server" Text='<%# Bind("tg") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowSelectButton="True" />
</Columns>
<RowStyle BackColor="White" ForeColor="#333333" Font-Names="Tahoma" Font-Size="10pt" />
<SelectedRowStyle BackColor="#339966" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#336666" ForeColor="White" HorizontalAlign="Center" />
<HeaderStyle BackColor="#336666" Font-Bold="True" ForeColor="White" />
</asp:GridView>
Ci siamo quasi, mi son dimenticato che l'evento databinding della dll parte prima del databind dalla sorgente quindi noi gli impostiamo SelectedValue prima e non lo trova.
Devi scrivere un po' di codice, intercettanto l'evento RowCreated, cerca ddlCart e intercetta l'evento DataBound. Nell'evento tramite il sender hai la ddlCart della riga in questione. Fai un FindControl di ddlCser per quella riga, prendi il value e lo imposti a ddlCart e non usi più la sintassi <%# per la seconda ddl

Ciao

Il mio blog
Homepage

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.