11 messaggi dal 22 gennaio 2014
Salve a tutti,
ho un problema su come filtrare una dropdownlist inserita in una gridview.
In pratica quando mi trovo su un rigo selezionato in modalita "modifica" della gridview deve mandare il valore alla dropdownlist e quindi filtrarla in base al valore della colonna denominata "DENOMINAZIONE_MATERIALI".Ho provato con il seguente Codice:

<asp:GridView id="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" CssClass="auto-style1" DataKeyNames="CHIAVE,DENOMINAZIONE_MATERIALI,TG_RICH,AZIONE" DataSourceID="AccessDataSource1" ForeColor="#333333" GridLines="None" RowHeaderColumn="CHIAVE"> <AlternatingRowStyle BackColor="White" /> <Columns><asp:CommandField ShowEditButton="True">
</asp:CommandField> <asp:BoundField DataField="CHIAVE" HeaderText="CHIAVE" InsertVisible="False" ReadOnly="True" SortExpression="CHIAVE">
</asp:BoundField>
<asp:TemplateField HeaderText="DENOMINAZIONE_MATERIALI" SortExpression="DENOMINAZIONE_MATERIALI"> <EditItemTemplate> <asp:TextBox id="TextBox1" runat="server" Text='<%# Bind("DENOMINAZIONE_MATERIALI") %>'></asp:TextBox> </EditItemTemplate> <ItemTemplate> <asp:Label id="Label1" runat="server" Text='<%# Bind("DENOMINAZIONE_MATERIALI") %>'></asp:Label>
</ItemTemplate></asp:TemplateField> <asp:TemplateField HeaderText="TG_RICH" SortExpression="TG_RICH"> <EditItemTemplate> <asp:DropDownList id="DropDownList1" runat="server" AutoPostBack="True" DataSourceID="AccessDataSource2" DataTextField="TAGLIE" DataValueField="TAGLIE" SelectedValue='<%# Bind("TG_RICH") %>'> </asp:DropDownList> <asp:AccessDataSource id="AccessDataSource2" runat="server" DataFile="Gestione Vestizione Web.mdb" SelectCommand="SELECT [TAGLIE], [DENOMINAZIONE2] FROM [TAGLIE] WHERE ([DENOMINAZIONE2] = ?) ORDER BY [TAGLIE]"> <SelectParameters> <asp:ControlParameter ControlID="GridView1" Name="DENOMINAZIONE2" Type="String" PropertyName="SelectedValue" /> </SelectParameters> </asp:AccessDataSource> </EditItemTemplate><ItemTemplate> <asp:Label id="Label2" runat="server" Text='<%# Bind("TG_RICH") %>'>/asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="AZIONE" SortExpression="AZIONE"> <EditItemTemplate> <asp:TextBox id="TextBox3" runat="server" Text='<%# Bind("AZIONE") %>'></asp:TextBox> </EditItemTemplate><ItemTemplate> <asp:Label id="Label3" runat="server" Text='<%# Bind("AZIONE") %>'></asp:Label></ItemTemplate></asp:TemplateField></Columns>
Ma mi da sempre il seguente errore:
SelectedValue in 'DropDownList1' non valido, poiché non è incluso nell'elenco di elementi.
Nome parametro: value
se qualcuno potrebbe darmi una mano gliene sarei grato.
grazie anticipatamente
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, benvenuto nel forum!
anziché popolare la DropDownList1 con un AccessDataSource, prova ad agire direttamente sulla sua collezione Items, come vedi fare qui:
http://forum.aspitalia.com/forum/post/397716/Aiuto-Neofita-Personalizzazione-Gridview-Formview-Modalita-Editing.aspx#397773

Lì si vede una funzione legata al suo evento Init, che riempie la DropDownList con i suoi elementi prima che il binding con il campo abbia luogo.
L'errore che stai ottenendo, infatti, vuol dire che il SelectedValue in questo momento viene impostato troppo presto, quando ancora l'AccessDataSource non ha avuto l'opportunità di estrarre gli elementi ed assegnarli alla DropDownList.

ciao,
Moreno
Modificato da BrightSoul il 02 febbraio 2014 10.34 -

Enjoy learning and just keep making
11 messaggi dal 22 gennaio 2014
Ciao,
ma in questo modo la dropdownlist viene filtrata in base al valore che in quel momento e selezionato nel rigo?
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

adolf ha scritto:

ma in questo modo la dropdownlist viene filtrata in base al valore che in quel momento e selezionato nel rigo?

Dovrai essere tu, manualmente, a recuperare il valore della colonna DENOMINAZIONE_MATERIALI e decidere quali siano gli Items da inserire nella DropDownList.

Il valore di quella colonna lo puoi recuperare così dall'interno della funzione che hai legato all'OnInit:
var valore = ((sender as DropDownList).NamingContainer as GridViewRow).DataItem["DENOMINAZIONE_MATERIALI"];
//e qui scegli gli items in base a quel valore.


Se questo sistema ti sembra troppo laborioso, puoi anche fare diversamente. Ad esempio impostando il DataSource della DropDownList con un'espressione di binding:
<asp:DropDownList id="DropDownList1" runat="server" AutoPostBack="True" DataSource='<%# OttieniDataSource(Eval("DENOMINAZIONE_MATERIALI")) %>' SelectedValue='<%# Bind("TG_RICH") %>'> </asp:DropDownList> 

Dato che così passi il parametro DENOMINAZIONE_MATERIALI come argomento alla funzione OttieniDataSource, potrai poi filtrare i valori.
protected IEnumerable<string> OttieniDataSource(object denominazioneMateriali){
 //qui usa denominazioneMateriali come parametro in una SELECT SQL
 //e restituisci tutti i valori trovati
}


ciao,
Moreno

Enjoy learning and just keep making
11 messaggi dal 22 gennaio 2014
Grazie Moreno,
lunedì a lavoro provo come hai detto tu.
Buon fine settimana

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.