Impostare un selectedValue in un menu a tendina dentro una GridView: c...

mercoledì 11 novembre 2009 - 12.59

leone8 Profilo | Newbie

Ciao a tutti! Sono un principiante assoluto di ASP.NET ed è il mio primo post
Vi spiego il mi problema:
ho una Gridview, contenente un campo <EditItemTemplate>, dove ho inserito una DropDownList (che vado a popolare dinamicamente con 4 items predefiniti, ad esempio:
1)foo
2)bar
3)pippo
4)pluto ).

Poniamo che il campo della Gridview mostri l'item "pippo" e voglio editarlo:
Quando vado a fare l'edit sulla DropDownList di prima, mi ritrovo sempre selezionata la 1a item, in questo caso:"foo"; invece vorrei ritrovarmi l'tem "pippo".
Quindi come faccio a impostare il SelectedValue col valore "vecchio" prima di selezionare quello nuovo?
Vi ringrazio in anticipo per la pazienza ragazzi, vi allego il codice del CodeBehind


protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if((e.Row.RowState == DataControlRowState.Edit)|| (e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit)) ) { //popola la dropddownlist DropDownList ddl1 = (DropDownList)e.Row.FindControl("DropDownList1"); //items predefinite di questo menu a tendina ddl1.Items.Add("foo"); ddl1.Items.Add("bar"); ddl1.Items.Add("pippo"); ddl1.Items.Add("pluto"); } } protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { //indice della riga editata int index = GridView1.EditIndex; //ottieni la riga editata della GridView GridViewRow row = GridView1.Rows[index]; //ottieni i controlli che contengono i valori aggiornati DropDownList ddl1 = (DropDownList)row.Cells[4].FindControl("DropDownList1"); //Aggiungi i valori aggiornati al dizionario NewValues e.NewValues["categoria"] = ddl1.SelectedValue; }

FrancescoGuadagno Profilo | Senior Member

Ciao, se ho capito il problema, non hai molte scelte.. devi occuparti tu di tener traccia del vecchio valore selezionato.
L'anomalia che tu vedi è dovuta al fatto che di dropdownlist ne hai due per ogni riga, una in versione Item, l'altra in versione EditItem. Quando selezioni "pippo" lo stai facendo sulla versione Item, quando vai in modifica (e non è chiaro come fai) stai vedendo la versione Edit, pertanto in qualche modo devi ricostruire nella versione edit la situazione che avevi nella item. Spero di essere stato chiaro.

leone8 Profilo | Newbie

Ciao, hai centrato il punto:
all'inizio nel campo categoria ho "pippo"

652x135 7Kb

Quando clicco su "Modifica" la prima voce del menu a tendina è "foo"

684x225 11Kb

Nel code behind dovrei fare qualcosa tipo:
miaItem.selectedValue = "vecchiaItem"
ma non so come fare a livello di codice!

FrancescoGuadagno Profilo | Senior Member

>Ciao, hai centrato il punto:
>all'inizio nel campo categoria ho "pippo"
>
>Quando clicco su "Modifica" la prima voce del menu a tendina
>è "foo"
>
>Nel code behind dovrei fare qualcosa tipo:
>miaItem.selectedValue = "vecchiaItem"
>ma non so come fare a livello di codice!

Allora, il problema è questo: secondo il tuo approccio, non hai una collezione di oggetti "esterni" alla griglia. Quello che voglio dire è che la griglia sicuramente ha una sua sorgente dati. La tua sorgente dati assomiglia a una anagrafica di oggetti riconducibili ad esempio a una persona (nome, cognome, titolo, sottotitolo, e categoria che vuoi mostrare nella ddl).

L'oggetto potrebbe essere così fatto:
Persona
- ID
- Nome
- Cognome
- Titolo
- Sottotitolo
- IDCategoria
- NomeCategoria

Anche se, guardandola da un punto di vista relazionale, sicuramente per ogni "persona" non specifichi il nome bensì il codice. Questo perchè esiste poi un'altra tabella che contiene le possibili categorie, nella coppia (codice, nomeCategoria).

Detto questo, in un determinato momento tu associ al DataSource della tua griglia la tua collection di persone letta da database (ad esempio un DataTable piuttosto che una List<Persona>). La griglia viene effettivamente popolata quando viene richiamato il metodo DataBind(). Sintetizzando, la tua seguenza è qualcos del tipo:

List<Persona> collPersone = GetPersone(); GridViewPersone.DataSource = collPersone; GridViewPersone.DataBind();
A questo punto però tu giustamente dici che il layout del campo categoria in modifica è diverso da quello in visualizzazione. Devi allora intervenire nell'evento RowDataBound della GridView e fare uno switch nel codice a seconda che si tratti di una riga in stato Edit o Item (come già tra l'altro hai fatto). In caso di editing, devi recuperare la tua DropDownList, popolarla dei possibili elementi (anagrafica della tabella categoria) e infine selezionare nella ddl l'elemento con codice corrispondente alla categoria del tuo oggetto "Persona" corrente.

Come vedi lo puoi fare perchè hai da un lato un source per la gridview. Il suorce è qualcosa di parallelo alla griglia. La griglia rappresenta la collection di oggetti, la singola riga della griglia rappresenta il singolo oggetto Persona della collection. Per ogni riga decidi cosa visualizzare (e nel caso della ddl cosa selezionare) in base alla relativa riga della sorgente.

Non riesci a farlo nel tuo esempio perchè non è chiara la sorgente. Non è chiaro perchè nella modalità Item tu all'inizio hai "pippo". Se hai "pippo" perchè l'hai recuperato da una sorgente, allora la stessa sorgente la devi utilizzare in Edit, secondo la modalità che ti ho macroscopicamente descritto.
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