Обновление ячеек в DataTable - PullRequest
1 голос
/ 15 марта 2010

Я пишу небольшое приложение для небольшой обработки некоторых ячеек в имеющемся у меня CSV-файле. Я понял, как читать и записывать файлы CSV с помощью библиотеки, которую я нашел в сети, но у меня возникли проблемы: библиотека анализирует файлы CSV в DataTable, но , когда я пытаюсь изменить ячейку таблицы , это не сохраняет изменения в таблице!

Ниже приведен код. Я разделил процесс на несколько переменных и переименовал некоторые вещи, чтобы было легче отлаживать этот вопрос.

Код

Внутри цикла:

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;

После цикла:

readIn.AcceptChanges();

Когда я отлаживаю свой код, я вижу, что towrite формируется правильно и все в порядке, за исключением того, что строка не обновляется: почему она не работает? У меня такое ощущение, что я совершаю здесь простую ошибку: в последний раз, когда я работал с DataTables (довольно давно), у меня были похожие проблемы.

Если вам интересно, почему я добавляю еще одну запятую в towrite , это потому, что я объединяю поле адреса улицы с полем почтового индекса - надеюсь, это ничего не испортит.

Мой код немного грязный, так как я пытаюсь отредактировать только один файл, чтобы сделать небольшое исправление, извините.

Ответы [ 2 ]

4 голосов
/ 15 марта 2010

Самый простой способ редактировать значения отдельных столбцов - использовать свойство индексатора DataRow.Item:

readIn.Rows[i][numColumnToCopyTo] = (object)towrite;

Это плохо документировано, но метод доступа DataRow.ItemArray * get возвращает копию базовых данных. Вот реализация, предоставленная Reflector :

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;
}

Существует неуклюжий альтернативный метод для редактирования значений столбцов: получите строку ItemArray, измените эти значения, затем измените строку, чтобы использовать обновленный массив:

object[] values = readIn.Rows[i].ItemArray;
values[numColumnToCopyTo] = (object)towrite;
readIn.Rows.ItemArray = values;
0 голосов
/ 11 марта 2013

использование 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();
...