DataTable的ItemArray赋值不起作用

3

我知道这很琐碎,但今天真的很长。

我有一个DataTable,其中一行有一个空单元格。我想找到具有空单元格的行,并将字符串简单地分配给该单元格的值。

然而,当我在调试过程中逐步执行代码时,该值从未被插入表中。我做错了什么???

currentTime = DateTime.Now.ToString();

for (int i = 0; i < OwnersTable.Rows.Count; i++)
    if (OwnersTable.Rows[i].ItemArray[9].ToString() == "")
        OwnersTable.Rows[i].ItemArray[9] = currentTime;

我发现要完成这个任务,我必须创建一个全新的行,复制每一列现有行的内容,并将其添加回表格中。

为什么简单的单元格赋值在上面的代码中不起作用???

3个回答

4

DataRow.ItemArray 的 getter 返回一个包含整个行值的数组,修改数组元素不会对行值造成任何影响。

通过数组获取或设置此行的所有值。

因此,需要使用 setter 将一个数组分配给它,但我不建议使用这种方式:

currentTime = DateTime.Now.ToString();

for (int i = 0; i < OwnersTable.Rows.Count; i++) {
    object[] items = OwnersTable.Rows[i].ItemArray;         
    if (items[9].ToString() == string.Empty) {            
        items[9] = currentTime
        OwnersTable.Rows[i].ItemArray = items;
    }
}

你可以使用 DataRow 的 SetField 方法来代替:

SetField 方法。

currentTime = DateTime.Now.ToString();
foreach (DataRow row in OwnersTable.Rows) {
    string value = row.Field<string>(9);
    if (string.IsNullOrEmpty(value)) {            
        row.SetField<string>(9, currentTime) 
    }
}

请注意,我假设该字段为字符串类型。

你从哪里得到这些“Field”和“SetField”方法的? - gh0st
你是什么意思?抱歉,我的英语不太好 :D - Mehrzad Chehraz
没问题。 按照您的建议使用row.Field和row.SetField后,我遇到了以下错误。 错误27:'object'不包含'SetField'的定义。 错误25:'object'不包含'Field'的定义。 - gh0st
1
我更新了答案。这是因为我使用了“var”而不是“DataRow”。 - Mehrzad Chehraz

0
在遇到同样的问题后,我刚刚看到了这篇文章。一个更直接的方法是使用row[columnIndex]来测试和分配值,而不是使用Mehrzad提到的ItemArray问题。行的直接索引器不会引用行数据的副本。代码如下:
for (int i = 0; i < OwnersTable.Rows.Count; i++)

如果 (OwnersTable.Rows[i][9].ToString() == "") OwnersTable.Rows[i][9] = currentTime;


0

我曾面临同样的问题。显然,在赋值时不需要关键字ItemArray。

所以,你可以使用下面的代码来代替: OwnersTable.Rows[i][9] = currentTime;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接