更新DataTable中的单元格

时间:2010-03-15 15:58:18

标签: c# .net datatable dataset datarow

我正在编写一个小应用程序,对我所拥有的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 中添加另一个逗号,那是因为我将街道地址字段与邮政编码字段相结合 - 我希望这不会弄乱任何东西。< / p>

我的代码有点混乱,因为我只是想编辑一个文件来做一个小修复,很抱歉。

2 个答案:

答案 0 :(得分:4)

编辑单个列值的最简单方法是使用DataRow.Item索引器属性:

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

这没有详细记录,但DataRow.ItemArrayget访问者会返回基础数据的 副本 。这是实施,由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;

答案 1 :(得分:0)

使用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();