Item template dropdownlist

martedì 13 ottobre 2009 - 15.20

toniovigi Profilo | Expert

Ragazzi,

credo sia semplice da risolvere ma non ci riesco,

ho creato un itemtemplate drodownlist su un campo della mia gridview

ora come faccio a far si che quando seleziono un item della dropdownlist quel valore mi popoli la dropdown

praticamente il problema è :

apro il grid->clicco su modifica->mi appare la dropdownlist->seleziono il mio valore->invece di avere il mio valore in tabella ricevo : SelectedValue in 'DropDownList1' non valido, poiché non è incluso nell'elenco di elementi.
Nome parametro: value

Che fare??

martinez Profilo | Senior Member

Ciao ...
Credo di aver capito il tuo problema ...
la risposta sta proprio nell'errore che ricevi ... manca il parametro selectedValue nella drop ...
inoltre spero che tu abbia messo il tutto in EditItemTemplate e non in ItemTemplate come dici ...


ti visualizzo un esempio:

<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="TuoDataSource" DataTextField="TestoDelCampo" DataValueField="ValoreDelCampo" SelectedValue='<%# Bind("IlCampoDaModificareInTabella") %>'> </asp:DropDownList>

toniovigi Profilo | Expert

Ciao martinez,

premetto che per popolare la dropdown ho aggiunto io gli item con lo smart tag "modifica elementi",anche perchè sono solo 2,faccio il bind,il codice generato è:

<EditItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server"
SelectedValue='<%# Bind("Vene") %>'>
<asp:ListItem>presente</asp:ListItem>
<asp:ListItem>assente</asp:ListItem>
</asp:DropDownList>
</EditItemTemplate>

Vene è il nome del campo che devo aggiornare ma sempre l'errore e quello quando clicco modifica

Help meeee


Gluck74 Profilo | Guru

è probabile che il campo Vene, specificato in SelectedValue='<%# Bind("Vene") %>', non abbia i valori "presente" ed "assente"?

Cosa contiene questo campo nella tabella?

un consigio: quando hai qualche problemino che ti assilla, dai un'occhiatina anche al codice HTML generato. A volte la soluzione la trovi proprio li. Io mi sono salvato diverse volte in questo modo... (poco prima di tagliarmi le vene.... hi hi hi)

toniovigi Profilo | Expert

Il campo è vuoto,ma come faccio a mettere nel campo 2 valori???

Io ho aggiunto gli item solo nella dropdownlist

Gluck74 Profilo | Guru

non mi sono spiegato.. non devi mettere nel campo 2 valori... che significato ha????

cerco di spiegarmi.
il dropdownlist ha 2 scelte: presente, assente
non avendo specificato l'attibuto value, si intende che i valori sono identici ai testi visibili.
Cosa succede quando l'istruzione bind viene chiamata? succede che viene preso il valore dalla tabella (e tu mi dici che ha NULL), e DEVE essere associato ad uno dei valori nella ddl.
qui il problema, il valore NULL non esiste.

che ti poi di tati ci sono nel campo della tabella???

toniovigi Profilo | Expert

Dati testo,semplici stringhe,ma quindi per risolvere come devo fare??

Devo inserire dei valori nel database?Ho sbagliato e inserire gli item della dropdown??

martinez Profilo | Senior Member

Ciao

credo che il problema sia sempre quello ... manca il value della drop ... prova con l'inserire il value come da esempio e fammi sapere

poi una domanda presente - assente sul DB com'eè espresso??? testo oppure vero/falso??? forse si risolve meglio con un radiobutton .... se sono solo 2 valori vero falso

<asp:ListItem value="presente">presente</asp:ListItem>

ciao!

toniovigi Profilo | Expert

sempre lo stesso errore avevo gia provato cosi,
i campi nel db sn di valore testo provero a cambiare,

martinez Profilo | Senior Member

Buongiorno ....

a mali estremi estremi rimedi ...

puoi provare ad aggiornare il DB dal RowUpdating della griglia

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { if (GridView1.EditIndex >= 0) { GridViewRow row = GridView1.Rows[GridView1.EditIndex]; DropDownList VeroFalso= (DropDownList)row.FindControl("DropDownList1"); e.NewValues["CampoDB"] = VeroFalso.SelectedItem.ToString(); } }

credo che così debba funzionare!!!

saluti
Antonio

Gluck74 Profilo | Guru

cavolo, ieri ti stavo postando la soluzione, poi si è piantato il server..... booooo

dove eravamo rimasti???? a si.....
praticamente tu nella ddl hai due valori: presente, assente.
il problema nasce quando il controllo carica dalla tabella una stringa vuota. non trova un valore da associare.
le soluzioni sono 2:
o metti un ulteriore listitem vuoto: <asp:ListItem></asp:ListItem>

oppure metti una funzione di controllo valori:
<asp:DropDownList ID="DropDownList3" runat="server" SelectedValue="<%# controlla(Container.DataItem) %>">
e nel codice:

protected string controlla(object value) { if ( ((DataRowView)value)["Vene"] != null) if(((DataRowView)value)["Vene"].ToString() != string.Empty) return ((DataRowView)value)["Vene"].ToString(); return null; }

toniovigi Profilo | Expert

HO risolto mettendo un Listitem vuoto,

GRANDE
, ti chiedo un altra cosa


ho una fuinzione nell'evento Rowdatabound che colora le celle
if (e.Row.RowType == DataControlRowType.DataRow)
{
for (int i = 3; i < e.Row.Cells.Count; i++)
{
if (e.Row.Cells[i].Text == ("presente") || e.Row.Cells[i].Text == ("PRESENTE"))

e.Row.Cells[i].BackColor = System.Drawing.Color.LightGreen;

else
e.Row.Cells[i].BackColor = System.Drawing.Color.Red;

}

ma non me lo fa adex nel campo dove ho l'item template con la dropdown

Come risolvo??

Gluck74 Profilo | Guru

per quanto ne so io, nel rowDataBound l'istruzione e.Row.Cells[i].Text restituirà sempre stringa vuota perchè non ancora riempita.

devi usare l'oggetto dati che verrà associato alle celle:

((DataRowView)e.Row.DataItem)[i],

e poi occhi al for..
i < e.Row.Cells.Count - 1

toniovigi Profilo | Expert

Ma questa stringa

((DataRowView)e.Row.DataItem)[i],

poi nn mi fa mettere le funzioni tipo text o backcolor

Gluck74 Profilo | Guru

no infatti,
questa stringa è da usare solo all'interno dell' if
quello che hai scritto:
if (e.Row.Cells[i].Text == ("presente") || e.Row.Cells[i].Text == ("PRESENTE"))
non funziona perché e.Row.Cells[i].Text è sempre stringa vuota.

quindi :
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
o meglio ancora
if ( Ucase( ((DataRowView)e.Row.DataItem)[i] ) == "PRESENTE" )

tutto il resto rimane come prima

toniovigi Profilo | Expert

Glaucko forse parliamo di 2 cose diverse,

il codice
if (e.Row.RowType == DataControlRowType.DataRow)
{
for (int i = 3; i < e.Row.Cells.Count; i++)
{
if (e.Row.Cells[i].Text == ("presente") || e.Row.Cells[i].Text == ("PRESENTE"))

e.Row.Cells[i].BackColor = System.Drawing.Color.LightGreen;

else
e.Row.Cells[i].BackColor = System.Drawing.Color.Red;

}

funziona e mi coloare le celle con la scritta presente o PRESENTE di verde,invece tutto il resto di rosso,il mio problema è il fatto che se voglio controllare se in una cella non cè nessuna scritta non riesco,mi spiego,

se metto e.Row.Cell[i].text == "" nn va

Gluck74 Profilo | Guru

in questo momento sono molto confuso......
tu dici che ti funziona, e io non riesco in nessuna maniera a farlo funzionare.
Nel codice che sto testando ho sempre e costantemente e.Row.Cell[i].text uguale a stringa vuota.

non so che dire

toniovigi Profilo | Expert

In teoria qll che ho fatto è giusto,xke e.row.cell[i].restituisce il contenuto di quella cella,strano che ti dia null

cmq grazie lo stesso per gli altri aiuti :)

Gluck74 Profilo | Guru

non mi da null, altrimenti sarebbe grave, mi da stringa vuota, come se non avesse inserito nulla nella cella

infatti mi suona strato..... boooo, avrò sbagliato qualcosa nel test che ho fatto.

quello che hai fatto tu, in effetti, è teoricamente giusto, volevo solo confermartelo.

ciao ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5