【问题标题】:Updating Cells in a DataTable更新数据表中的单元格
【发布时间】:2011-01-27 18:10:09
【问题描述】:

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

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

【问题讨论】:

  • 也许您需要为 DataTable 调用 AcceptChanges()?图书馆是什么?
  • 糟糕,忘记在我上面的代码示例中包含 AcceptChanges 代码,但它并没有改变任何东西。我找到的图书馆在knab.ws/blog/index.php?/archives/…

标签: c# .net datatable dataset datarow


【解决方案1】:

编辑单个列值的最简单方法是使用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;

【讨论】:

    【解决方案2】:

    使用SetField&lt;&gt; 方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多