DataGrid e DataSource

venerdì 18 febbraio 2005 - 11.48

FrancescoGuadagno Profilo | Senior Member

Ciao,

Ho implementato un DataGrid che è collegato a un DataTable.

myDG.DataSource = myDT;
myDG.DataBind();

Ad un certo punto del codice ho la necessità di sincronizzare il contenuto del DG con il suo DataSource (il DG contiene diverse textbox editabili in qualsiasi momento, senza entrare in fase di editing). Ho provato quindi con:

DataTable tempDT = new DataTable();
tempDT = ((DataTable)myDG.DataSource);

//procedo con la copia di tempDT in myDT

ma non riesco ad ottenere niente in tempDT, anche se DataSource permette il GET.


Come fare?

19018 Profilo | Expert

Dovresti prima spiegare bene come è strutturato tutto, cioè se tutto è collegato ad una fonte dati fisica altrimenti non posso dirti la soluzione migliore al tuo problema...in ogni caso ti consiglio di usare un dataset come sorgente del datagrid così tutte le modifiche che fai nel datagrid si riflettono in automatico nel dataset!Ciao!

FrancescoGuadagno Profilo | Senior Member

Allora,

io ho utilizzato un dataset con una sola tabella che è sorgente per il mio DataGrid. Il dataset non è collegato ad alcun database. Viene popolato a runtime.

Solamente che non penso, come tu dici, che una modifica al datagrid si rifletta automaticamente sul dataset. O meglio, non in maniera implicita. Forse serve qualche istruzione.

spero che ora sia più chiaro

19018 Profilo | Expert

Ho scritto una veloce applicazione di prova che dovrebbe essere come la tua con un datagrid legato ad un dataset con una sola tabella...è come ti dico io...il dataset si aggiorna in automatico, per fare la prova ho aggiunto due tasti..in uno pongo il datasource e il datamember del datagrid a null così elimino tutte le eventuali relazioni tra il datagrid e i miei dati e nell'altro bottone riassegno al datagrid come sorgente il dataset e come membro la tabella. Ora all'inizio hai il datgrid con tutti i dati caricati, modifica uno dei dati poi clicca sul bottone che scollega la griglia col dataset e dopo premi l'altro e noterai che le tue modifiche sono rimaste in memoria nel dataser come ti avevo detto io.
Ecco il codice dei bottoni per la prova :
private void button1_Click(object sender, System.EventArgs e)
{
dataGrid1.DataSource = null;
dataGrid1.DataMember =null;
}

private void button2_Click(object sender, System.EventArgs e)
{

dataGrid1.DataSource = dataSet11;
dataGrid1.DataMember = "Proprietari";
dataGrid1.Refresh();
}

FrancescoGuadagno Profilo | Senior Member

ad ogni postback io ricarico correttamente il dataset dalla viewstate. Non ho un problema di questo tipo. il problema è come trasferire velocemente i dati dal mio dg al datatable che lo ha generato, in senzo inverso a quello del databind.

19018 Profilo | Expert

Il codice postato in precedenza è per applicazione win form, non avevo capito si trattasse di un progetto web!!In ogni caso...ho scritto più di qualche applicazione web con datagrid e non ricordo di aver mai usato comandi particolari per aggiornare il dataset che è sorgente della griglia...infatti nel caso in cui il dataset è collegato ad un dataadapter basta chiamare il metodo update() che fa la scansione dello stato dei record delle tabelle del dataset per eventuali aggiornamenti....ma l'aggiornamento del dataset avviene in maniera automatica, tranne in casi particolari!

FrancescoGuadagno Profilo | Senior Member

...non uso dataadapter...

19018 Profilo | Expert

Il dataadapter nel mio esempio non è legato al fatto del dataset e della griglia...io rimango della convinzione che non ci sono metodi da chiamare,l' unico in determinati casi è AcceptChanges()...quando li trovi per favore fammi sapere!ciao!

FrancescoGuadagno Profilo | Senior Member

Io non credo funzioni così e voglio fare un esempio:

Allo stato attuale io ho un dataset in memoria ViewState (sorgente del DG) e un DG che ha la ViewState integrata. Quando la pagina si trova lato Client, l'utente va praticamente a "modificare" le ViewState del DG mentre non tocca quelle del dataset.
Nel momento in cui genera l'evento, il controllo passa al server che come prima cosa ricarica dalla ViewState il Dataset, che quindi è inconsistente con il DG.
E' chiaro che se io faccio il Bind del DG risincronizzo in questo verso: DataSet-->DataGrid.
Ma in questo modo ho perso i valori che l'utente aveva inserito.

Priama del Bind devo sincronizzare in questo senso: DataGrid-->DataSet

e l'unico modo (per ora trovato) è:

MyDT.Rows.Clear();

for (int i=0;i< MyDG.Items.Count;i++)

{

DataRow dr = MyDT.NewRow();

dr["Campo1"] = ((TextBox)(MyDT.Items[i].FindControl("tbCampo1"))).Text;

dr["Campo2"] = ((TextBox)(MyDT.Items[i].FindControl("tbCampo2"))).Text;

MyDT.Rows.Add(dr);

}

dove MyDt è l'istanza della tabella del Dataset, ma come si vede devo mappare manualmente i webcontrols del DG con le colonne del DT

19018 Profilo | Expert

Ecco il codice che ho usato in una applicazione web per la modifica dei record :
private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string key = DataGrid1.DataKeys[e.Item.ItemIndex].ToString();//recupera il valore della chiave primaria del record selezionato
string note;
string data;
string importo;
TextBox tb_note;
TextBox tb_data;
TextBox tb_importo;

try
{

oleDbDataAdapter1.SelectCommand.Parameters["IDUtente"].Value=utente.getIDUtente();//imposta il parametro della select che è parametrizzata
oleDbDataAdapter1.Fill(dataSet12);//riempie il dataset con i dati recuperati

tb_data = (TextBox) e.Item.Cells[2].Controls[0];//recupera il controllo della cella 2
data = tb_data.Text;

tb_importo = (TextBox) e.Item.Cells[5].Controls[0];//recupera il controllo della cella 5
importo = tb_importo.Text;

tb_note = (TextBox) e.Item.Cells[6].Controls[0];//recupera il controllo della cella 6
note = tb_note.Text;

System.Data.DataRow r;
r = dataSet12.Tables["Entrate"].Rows.Find(int.Parse(key));//recupera una riga in base al valore della sua chiave primaria
r["Note"]=note;//assegna alla cella note della riga il valore della variabile note
r["Data"]=data;
r["Importo"]=importo;
oleDbDataAdapter1.Update(dataSet12);//aggiorna il database con i valori del dataset appena modificati

}
catch(ArgumentException)
{
Avvisi.Text = "E' stato inserito un valore non corretto.Riprovare o contattare l'amministratore del sistema.";
}
catch(Exception err)
{
Avvisi.Text = err.Message + " Riprovare o contattare l'amministratore del sistema.";
}
finally
{
DataGrid1.EditItemIndex = -1;
bindGenerale();
}

}
Ora lascia perdere il fatto che viene utilizzato un dataadapter, concentrati sull'evento update del datagrid e come io ho aggirnato il dataset e quindi la tabella :
System.Data.DataRow r;
r = dataSet12.Tables["Entrate"].Rows.Find(int.Parse(key));//recupera una riga in base al valore della sua chiave primaria
r["Note"]=note;//assegna alla cella note della riga il valore della variabile note
r["Data"]=data;
r["Importo"]=importo;
Capito?!?non devi chiamare alcun metodo...devi solo aggiornare i valori della riga che hai modificato!
Ciao!Spero ti possa essere di aiuto!

FrancescoGuadagno Profilo | Senior Member

si ma in questo modo non stai aggiornando solamente la riga del datagrid che genera l'evento update?

e comunque in maniera indiretta ho visto che anche tu mappi campo per campo il datagrid con il Datarow del datatable-

Volevo capire se esiste un modo per ottenere una mappatura automatica del dg con il dataset, visto che è stato il dataset che ha generato il dg

19018 Profilo | Expert

Si modifico solo il record selezionato, sfrutto il link edit del datagrid!un modo diretto per farlo c'è...usa la classe CurrencyManager e il bindingcontext del form...cerca in rete ci sono vari esempi!bye bye :)
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