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.

È stato utile?

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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top