GridView, recuperare il valore di un campo modificato

giovedì 03 luglio 2008 - 12.43

sarcidi Profilo | Newbie

Salve a tutti,
ho un GridView (composto da due colonne, "OT_DATE" e "OT_TEXT") che popolo
così (non uso per il momento ObjectDataSource):
{
....
IList<Oli_text> text = my_bl.GetTextFromSQL(DEFAULT_LANG, value);
this.Session["OLI_TEXT"] = text;
GridView1.DataSource = text;
string[] datakeys = { "OT_DATE" };
GridView1.DataKeyNames = datakeys;
GridView1.DataBind();
....
}

La proprietà AutoGenerateEditButton è a True.
Quando premo il pulsante "Modifica" viene chiamato questo metodo:

protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
GridView1.DataSource = this.Session["OLI_TEXT"];
string[] datakeys = { "OT_DATE" };
GridView1.DataKeyNames = datakeys;
GridView1.DataBind();
}

A questo punto la colonna "OT_TEXT" diventa editabile ed io cambio il testo.
Premendo, successivamente, "Aggiorna", viene chiamato questo metodo:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = GridView1.Rows[e.RowIndex];
string modifiedText = row.Cells[1].Text.ToString(); // ****
GridView1.EditIndex = -1;
}

Qualcuno potrebbe spiegarmi perché alla riga contrassegnata da "****" c'è il
valore del campio OT_DATE (che mi aspetterei di trovare all'indice 0...) ?
Per farla in breve, come faccio a recuperare il valore del testo modificato
(campo "OT_TEXT") ?

Grazie infinite a chi vorrà aiutarmi.
Sergio

paoval72 Profilo | Senior Member

Ciao, ma la colonna dell'edit in che posizione l'hai messa? Se è all'inizio della griglia (dove per default la inserisce VS), sarà lei la cell[0].
Ciao,



Paolo

sarcidi Profilo | Newbie

>Ciao, ma la colonna dell'edit in che posizione l'hai messa? Se
>è all'inizio della griglia (dove per default la inserisce VS),
>sarà lei la cell[0].

Ciao,
le colonne sono (in ordine) OT_DATE, OT_TEXT.
OT_DATE è settata come DataKey (questo forse è il motivo per cui quando modifico mi rende editabile automaticamente OT_TEXT).
Tutto è gestito da codice (vedi listato).
Grazie.
Sergio

paoval72 Profilo | Senior Member

ma la colonna dell'edit dov'è? Prima delle tue colonne?
Visto che è in autogenerazione, come ti ho scritto, dovrebbe essere aggiunta di default alla sinistra delle tue colonne.

sarcidi Profilo | Newbie

>ma la colonna dell'edit dov'è? Prima delle tue colonne?
>Visto che è in autogenerazione, come ti ho scritto, dovrebbe
>essere aggiunta di default alla sinistra delle tue colonne.

La GridView si presenta così:

[Modifica] [Elimina] [ot_date] [ot_text]

Quando premo su [Modifica] si rende editabile [ot_text]

Sergio

paoval72 Profilo | Senior Member

Ok, come ti ho scritto la cell[0] corrisponde all'edit/delete, la cell[1] alla tua prima colonna di testo.

Dunque:
row.Cells[0] è Edit/delete (In pratica i due bottoni sono due controlli in una sola colonna)
row.Cells[1] è OT_DATE,
row.Cells[2] è OT_TEXT

Per sicurezza, se vuoi, prova ad entrare in debug e a mettere un punto di controllo all'entrata dell metodo GridView1_RowEditing e a passare nella finestra di controllo immediato ogni cella.
row.Cells[0].Controls.Count dovrebbe darti 3: cioè:
1) scrivi: row.Cells[0].Controls[0], dovresti ottenere {Text = "Edit"}

2) scrivi: row.Cells[0].Controls[1], dovresti ottenere {System.Web.UI.LiteralControl}
Se vuoi il testo del Literal, fai il cast
((LiteralControl)row.Cells[0].Controls[1]).Text
e dovresti ottenere
"&nbsp;", cioè uno spazio vuoto

3) scrivi: row.Cells[0].Controls[0], dovresti ottenere {Text = "Delete"}

Ultima cosa: puoi evitare di fare il .toString() al text, che tanto restituisce già una stringa.
Spero di essere stato utile e chiaro.

Ciao,
Paolo

sarcidi Profilo | Newbie

>Ok, come ti ho scritto la cell[0] corrisponde all'edit/delete,

Ok.

>la cell[1] alla tua prima colonna di testo.

Ok.

>Dunque:
>row.Cells[0] è Edit/delete (In pratica i due bottoni sono due
>controlli in una sola colonna)
>row.Cells[1] è OT_DATE,
>row.Cells[2] è OT_TEXT

Perfetto.
Problema: perché nella GridView1_RowUpdating la row.Cells[2].Text è uguale a "" nonostante io abbia inserito del testo?
Come posso recuperare, al fine di inserirlo in un db, il nuovo testo?

>Per sicurezza, se vuoi, prova ad entrare in debug e a mettere
>un punto di controllo all'entrata dell metodo GridView1_RowEditing
>e a passare nella finestra di controllo immediato ogni cella.
>row.Cells[0].Controls.Count dovrebbe darti 3:

Ok.

>1) scrivi: row.Cells[0].Controls[0], dovresti ottenere {Text
>= "Edit"}
>
>2) scrivi: row.Cells[0].Controls[1], dovresti ottenere {System.Web.UI.LiteralControl}
>Se vuoi il testo del Literal, fai il cast
>((LiteralControl)row.Cells[0].Controls[1]).Text
>e dovresti ottenere
>" ", cioè uno spazio vuoto
>
>3) scrivi: row.Cells[0].Controls[0], dovresti ottenere {Text
>= "Delete"}

Ok.

>Spero di essere stato utile e chiaro.

Non mi sono chiari i seguenti punti:
- se row è la riga e Cells[x] è la colonna, perché a parità di riga e colonna ho tanti controlli? (Controls infatti è indicizzato).
- come faccio (domanda originaria) a recuperare ciò che l'utente ha scritto nella cella a seguito della pressione del tasto "Modifica" ?

Grazie.
Sergio

sarcidi Profilo | Newbie

Rileggendo meglio il tuo post, ho capito il tuo suggerimento, scrivendo:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = GridView1.Rows[e.RowIndex];
TextBox tb = (TextBox)row.Cells[2].Controls[0];
string modifiedText = tb.Text;
.....
}

Grazie per il tuo aiuto.
Sergio
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5