View Full Version : [ASP.NET 2] GridView e modifica dei template item
Nightmare
14-07-2006, 13:20
Ho un problema, apparentemente semplice.
Devo creare una semplice pagina che, selezionando una row di un GridView(chiamiamolo GV1) mi apre il dettaglio in un altra pagina in un altro GridView (chiamiamolo GV2)
I campi di GV1 corrispondono ai mesi, GV2 corrisponde ai giorni e vengono letti ambedue dal db
I campi di ogni Row di GV2 saranno subito modificabili, quindi in ogni row creo dei template item TextBox con gli opportuni databind e il databinding con la fonte dati lo associo da codice.
La visualizzazione è perfetta, è proprio come la volevo io, l'unico neo (e questo è il problema di cui ho bisogno di una soluzione) è che..
modificando qualsiasi textbox all'interno della griglia... e poi cliccando sul pulsante SALVA... va tutto bene tranne un piccolo particolare
Le query di insert partono ma con i valori "vecchi" cioè quelli che gia sono nel database...
è come se modificando i textbox le modifiche le vedo solo io, ma la pagina le vede ancora con i valori con cui è stata creata.. quindi non si salva nulla e i dati vengono perennemente riscritti in maniera identica alla precedente...
A cosa può essere dovuto questo problema?
Ho provato anche a far:
GridView1.DataSource = RappMan.CreateDataSource(IdRapp);
GridView1.DataBind();
GridView1.DataSource = null;
ma il risultato non cambia.
Crashbandy80
14-07-2006, 14:07
Il binding dei dati sulla gv lo effettui con un oggetto sqldatasource?
Se così fosse, cosa hai come valore della proprietà "OldValuesParameterFormatString"?
Magari posta il codice, l'updateCommand, .. :D
Nightmare
14-07-2006, 14:16
Il binding dei dati sulla gv lo effettui con un oggetto sqldatasource?
Se così fosse, cosa hai come valore della proprietà "OldValuesParameterFormatString"?
il binding ai dati lo effettuo tramite questa funzione:
public ICollection CreateDataSource(string IdRapp)
{
int mese = QueryGetMonthFromRapporto(IdRapp);
int anno = QueryGetYearFromRapporto(IdRapp);
//creazione scheletro struttura
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("giorno", typeof(string)));
dt.Columns.Add(new DataColumn("fermal", typeof(int)));
dt.Columns.Add(new DataColumn("oraa", typeof(string)));
dt.Columns.Add(new DataColumn("orap", typeof(string)));
dt.Columns.Add(new DataColumn("orapausa", typeof(string)));
dt.Columns.Add(new DataColumn("giornoFest", typeof(System.Drawing.Color)));
//creazione datareader
string sqlstr = "Select Giorno, MalFer, OraInizio, OraFine, Pausa From DayRapporti Where IdRapp='" + IdRapp + "'";
sqlcmd.CommandText=sqlstr;
SqlDataReader myrs = sqlcmd.ExecuteReader();
myrs.Read();
for (int i = 1; i <= DateTime.DaysInMonth(anno,mese); i++)
{
dr = dt.NewRow();
try
{
if (Convert.ToInt32(myrs[0].ToString()) == i)
{
dr[0] = i.ToString();
dr[1] = Convert.ToInt32(myrs[1].ToString());
dr[2] = myrs[2].ToString();
dr[3] = myrs[3].ToString();
dr[4] = myrs[4].ToString();
myrs.Read();
}
else
{
dr[0] = i.ToString();
dr[1] = 0;
dr[2] = "";
dr[3] = "";
dr[4] = "";
}
}
catch
{
dr[0] = i.ToString();
dr[1] = 0;
dr[2] = "";
dr[3] = "";
dr[4] = "";
}
DayOfWeek WeekOfDay = (new DateTime(anno, mese, i)).DayOfWeek;
if ((WeekOfDay == DayOfWeek.Sunday) || (WeekOfDay == DayOfWeek.Saturday))
{
dr[5] = System.Drawing.Color.Silver;
}
else
{
dr[5] = System.Drawing.Color.White;
}
dt.Rows.Add(dr);
}
myrs.Close();
DataView dv = new DataView(dt);
return dv;
}
ho dovuto creare questo escamotage solamente perche nel db potrebbero non esistere tutte le row del mese, ma nella griglia devono comunque esistere ed essere visualizzate vuote... inoltre è presente una colonna che contiene il colore dello sfondo della riga in modo da visualizzare i giorni festivi e i feriali
quindi quel che mi dici di controllare non posso controllarlo :/
Crashbandy80
14-07-2006, 14:26
Capito, è un po' che non ci guardo più dietro e sono arruginito.
Mi posti anche il codice dell'update (RowUpdating sul gv giusto?)?
Nightmare
14-07-2006, 15:00
Capito, è un po' che non ci guardo più dietro e sono arruginito.
Mi posti anche il codice dell'update (RowUpdating sul gv giusto?)?
Il command button SALVA fa esattamente questo quando viene premuto:
protected void cmdsalva_Click(object sender, EventArgs e)
{
foreach (GridViewRow GVR in GridView1.Rows)
{
RappMan.QueryInsertDayRapportini(GVR,IdRapp);
}
}
ogni ciclo richiama questa:
//Query di inserimento o update del DayRapportino
public void QueryInsertDayRapportini(GridViewRow GVR,string IdRapp)
{
string sqlstr;
int DayExist;
sqlstr = "Select count(*) from DayRapporti where IdRapp='" + IdRapp + "' and Giorno='" + GridReturnCol_1(GVR) + "'";
sqlcmd.CommandText = sqlstr;
DayExist = (int)sqlcmd.ExecuteScalar();
//try
//{
if (GridReturnCol_2(GVR) == 0)
{
if (DayExist == 0)
{
sqlstr = "Insert into DayRapporti (giorno, idRapp, malfer, orainizio, orafine, pausa)" +
" Values ('" + GridReturnCol_1(GVR) + "'," +
" '" + IdRapp + "'," +
" '0'," +
" '" + (GridReturnCol_3(GVR) == "" ? "0" : GridReturnCol_3(GVR)) + "'," +
" '" + (GridReturnCol_4(GVR) == "" ? "0" : GridReturnCol_4(GVR)) + "'," +
" '" + (GridReturnCol_5(GVR) == "" ? "0" : GridReturnCol_5(GVR)) + "')";
}
else
{
sqlstr = "Update DayRapporti" +
" Set malfer=0," +
" OraInizio=" + (GridReturnCol_3(GVR) == "" ? "0" : GridReturnCol_3(GVR)) + "," +
" OraFine=" + (GridReturnCol_4(GVR) == "" ? "0" : GridReturnCol_4(GVR)) + "," +
" Pausa=" + (GridReturnCol_5(GVR) == "" ? "0" : GridReturnCol_5(GVR)) +
" Where idRapp=" + IdRapp + " and" +
" Giorno=" + GridReturnCol_1(GVR);
}
}
else
{
if (DayExist == 0)
{
sqlstr = "Insert into DayRapporti (giorno, idRapp, malfer, orainizio, orafine, pausa)" +
" Value ('" + GridReturnCol_1(GVR) + "'," +
" '" + IdRapp + "'," +
" '" + GridReturnCol_2(GVR).ToString() + "'," +
" '0'," +
" '0'," +
" '0')";
}
else
{
sqlstr = "Update DayRapporti " +
" Set malfer='" + GridReturnCol_2(GVR).ToString() + "'," +
" OraInizio='0'," +
" OraFine='0'," +
" Pausa='0' " +
" Where idRapp='" + IdRapp + "' and " +
" giorno='" + GridReturnCol_1(GVR) + "'";
}
}
sqlcmd.CommandText = sqlstr;
sqlcmd.ExecuteNonQuery();
//}
//catch
//{ }
}
la lettura dei controlli all'interno dei template field avviene con queste
private const string col_1 = "lblgiorno"; //Label
private const string col_2 = "DropDownList1"; //DropDownList
private const string col_3 = "txtA"; //TextBox
private const string col_4 = "txtP"; //TextBox
private const string col_5 = "txtPausa"; //TextBox
//Legge i dati delle 5 colonne del GridView
public string GridReturnCol_1(GridViewRow GV)
{
Label appo;
appo = (Label)GV.FindControl(col_1);
return appo.Text;
}
public int GridReturnCol_2(GridViewRow GV)
{
DropDownList appo;
appo = (DropDownList)GV.FindControl(col_2);
return appo.SelectedIndex;
}
public string GridReturnCol_3(GridViewRow GV)
{
TextBox appo;
appo = (TextBox)GV.FindControl(col_3);
return appo.Text;
}
public string GridReturnCol_4(GridViewRow GV)
{
TextBox appo;
appo = (TextBox)GV.FindControl(col_4);
return appo.Text;
}
public string GridReturnCol_5(GridViewRow GV)
{
TextBox appo;
appo = (TextBox)GV.FindControl(col_5);
return appo.Text;
}
tuttosommato è semplice...
si carica la pagina.. modifico i dati.. e li salvo...
però in realta si carica la pagina.. modifico i dati.. e vengono perduti mentre nel datapase vengono reinseriti i dati gia presenti
Crashbandy80
14-07-2006, 15:40
Mmh, tu nei metodi "GridReturnCol_X", vai a leggere i valori presenti nel GV, e quest'ultimi, finché l'update non va a buon fine, non vengono aggiornati.
Perché non sfrutti gli eventi nativi del gridview per gestirli?
Nell'evento "RowUpdating" del grid view avresti l'argomento "GridViewUpdateEventArgs" che include sia i valori "pre-modifica" che i "post-modifica".
Ti semplificheresti la vita.
Nightmare
15-07-2006, 13:19
e l'evento rowupdating quando scatta? ora non ho la soluzione davanti en on posso provar.
Nightmare
18-07-2006, 08:54
non capisco.
nell'evento RowUpdating ho l'elemento e.NewValues ...
ma è una collection con 0 dictionary entry...
se provo ad accedere al gridview castando il sender
GridView GV = (GridView)sender;
e poi accedo agli oggetti... ho sempre lo stesso trattamento.
Crashbandy80
18-07-2006, 09:11
È meglio aspettare e sperare che qualcuno più esperto di me ti dia qualche consiglio.
Tu nella gv2 non imposti un 'editRow' (di una singola riga), visto che ogni textbox nei templateItem è naturalmente già editabile.
Senza scatenare l'evento rowEditing non puoi chiaramente sfruttare il metodo rowUpdating (come hai constatato) e comunque non è quello che serve a te.
Quindi il mio suggerimento era sbagliato o non adatto alla tua situazione :D
Ora si va per tentativi :p, e se scatenassi manualmente l'evento update di ogni riga del gv2 come prima cosa quando salvi?
Qualcosa del tipo
foreach (GridViewRow GVR in GridView2.Rows)
{
GridView2.UpdateRow(GVR.RowIndex, False) //True se vuoi la validazione
}
E dopo ne controlli il contenuto.
Che ne dici, potrebbe funzionare?
Nightmare
18-07-2006, 09:46
è precisamente ciò che ho fatto.
ma nel metodo NewValues non posso accedere ai template field perche restituisce un Dictionary... e se conto quanti DictionaryEntry contiene quel Dictionary.. rimango sopreso dal fatto che il risultato sia 0... :|
ho provato a cambiare l'oggetto.. utilizzando un DataList ma ha lo stesso problema...
un DataRepeater.. ma è uguale...
forse creerò 31 righe statiche in una tabella html con 31 * 5 = 155 controlli statici per far ciò che voglio fare... ma non credo sia una buona idea :)
Non è possibile che per fare una cosa così semplice, microsoft abbia complicato cosi tanto le cose... non posso fare quel che voglio ma devo fare per forza come Bill vuole, ma è da pazzi sta cosa...
Tutto automatizzato, 3 click e una query e hai la griglia piena e che aggiorna e inserisce anche, ma se non lo voglio io?
Crashbandy80
18-07-2006, 10:24
No ma aspetta, io intendevo di lasciar perdere il metodo rowupdating, quindi niente piu' 'oldValues' e 'newValues'.
Ma di eseguire l'update "manuale" delle righe prima di ogni cosa nel metodo del pulsante salva.
Nightmare
18-07-2006, 11:23
non ho capito.
in ogni caso utilizzando il metodo UpdateRow scatta un'eccezione se non gestisco l'evento RowUpdating.
Nightmare
18-07-2006, 11:58
sono un idiota...
ho lasciato asteriscato isPostBack nel metodo load...quindi faceva il postback riassociando la griglia alla fonte dati e riazzerando la digitazione prima dell'effettivo update/insert
funziona tutto perfettamente come avevo progettato inizialmente...
grazie cmq dell'aiuto! :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.