Aggiornamento di cellule in un DataTable
Domanda
Sto scrivendo una piccola applicazione per fare un po 'di elaborazione su alcune cellule in un file CSV che ho. Ho capito come leggere e scrivere i file CSV con una libreria che ho trovato on-line, ma sto avendo difficoltà: la biblioteca analizza i file CSV in un DataTable, ma, quando si tenta di modificare una cella della tabella , non è salvare la modifica nella tabella!
Di seguito è riportato il codice in questione. Ho separato il processo in più variabili e rinominato alcune delle cose per rendere più facile per eseguire il debug per questa domanda.
Codice
All'interno del ciclo:
string debug1 = readIn.Rows[i].ItemArray[numColumnToCopyTo].ToString();
string debug2 = readIn.Rows[i].ItemArray[numColumnToCopyTo].ToString().Trim();
string debug3 = readIn.Rows[i].ItemArray[numColumnToCopyFrom].ToString().Trim();
string towrite = debug2 + ", " + debug3;
readIn.Rows[i].ItemArray[numColumnToCopyTo] = (object)towrite;
Dopo il ciclo:
readIn.AcceptChanges();
Quando il debug il mio codice, vedo che towrite è in via di formazione in modo corretto e tutto a posto, tranne che la riga non viene aggiornata: perché non sta funzionando? Ho la sensazione che sto facendo un semplice errore qui:. L'ultima volta che ho lavorato con DataTable (molto tempo fa), ho avuto problemi simili
Se vi state chiedendo perché sto aggiungendo un'altra virgola in towrite , è perché sto combinando un campo di indirizzo con un campo di codice postale -. Spero che non è rovinare nulla fino
Il mio codice è una specie di disordinato, come io sto solo cercando di modificare un file di fare una piccola correzione, così dispiaciuto.
Soluzione
Il modo più semplice per modificare i valori delle colonne individuali è quello di utilizzare la DataRow.Item
proprietà indicizzatore:
readIn.Rows[i][numColumnToCopyTo] = (object)towrite;
Questa non è ben documentato, ma di accesso DataRow.ItemArray
s 'get
restituisce un copia dei dati sottostanti. Ecco l'implementazione, per gentile concessione di Riflettore :
public object[] get_ItemArray() {
int defaultRecord = this.GetDefaultRecord();
object[] objArray = new object[this._columns.Count];
for (int i = 0; i < objArray.Length; i++) {
DataColumn column = this._columns[i];
objArray[i] = column[defaultRecord];
}
return objArray;
}
C'è un metodo alternativo scomodo per valori di colonna editing: ricevi ItemArray
di una riga, modificare tali valori, quindi modificare la riga di utilizzare la matrice aggiornamento:
object[] values = readIn.Rows[i].ItemArray;
values[numColumnToCopyTo] = (object)towrite;
readIn.Rows.ItemArray = values;
Altri suggerimenti
utilizzare il metodo SetField<>
:
string debug1 = readIn.Rows[i].ItemArray[numColumnToCopyTo].ToString();
string debug2 = readIn.Rows[i].ItemArray[numColumnToCopyTo].ToString().Trim();
string debug3 = readIn.Rows[i].ItemArray[numColumnToCopyFrom].ToString().Trim();
string towrite = debug2 + ", " + debug3;
readIn.Rows[i].SetField<string>(numColumnToCopyTo,towrite);
readIn.AcceptChanges();