我需要一些帮助,例如我的数据表中有以下项目
第1栏|第2栏|第3栏|第4栏|第5栏|第6栏
RowX | 1 | 12 | 0 | |
RowX | 2 | 12 | 0 | |
RowX | 3 | 12 | 0 | |
RowY | 3 | 12 | 1 | |
RowY | 1 | 12 | 1 | |
我希望得到这一行的索引
RowX | 3 | 12 | 0 | |
因为我想更新此行的第5列和第6列。如果我使用上面的查询,如
var index = from row in DataTable1.AsEnumerable()
let r = row.Field<string>("Column1")
let s = row.Field<int>("Column2")
let t = row.Field<string>("Column3")
let u = row.Field<string>("Column4")
where r == DataRowX && s == 12 && t == 3 && u == 0
select DataTable1.Rows.IndexOf(row);
DataTable1.Rows[index]["Column5"] = intUpdateValueColumnx;
DataTable1.Rows[index]["Column6"] = intUpdateValueColumny;
DataTable1.AcceptChanges();
这不起作用,因为Argument 1:无法从'System.Data.EnumerableRowCollection'转换为'int'。如何获得索引?
还有另一种方法可以达到这个目的吗?
提前感谢...
答案 0 :(得分:0)
index
应为int
,表示您要更改的行的位置或“索引”。
您正在使用第一行<{1}}将index
设置为EnumerableRowCollection
var index = from row in DataTable1.AsEnumerable()
let r = row.Field<string>("Column1")
let s = row.Field<int>("Column2")
let t = row.Field<string>("Column3")
let u = row.Field<string>("Column4")
where r == DataRowX && s == 12 && t == 3 && u == 0
select DataTable1.Rows.IndexOf(row);
所以index
实际上是一组索引。
您可能想要做类似的事情,
foreach (var row in DataTable1.AsEnumerable().Where(r =>
r.Field<string>("Column1") == DataRowX &&
r.Field<int>("Column2") == 12 &&
r.Field<string>("Column3") == "3" &&
r.Field<string>("Column4") == "0"))
{
row.SetField("Column5", intUpdateValueColumnx);
row.SetField("Column6", intUpdateValueColumny);
}
DataTable1.AcceptChanges();
这将更新符合条件的所有行。可能有很多或没有。
答案 1 :(得分:0)
Enumerable.Where
返回多个元素,在本例中为IEnumerable<int>
,您可以使用foreach
枚举所有元素:
foreach(int index in indices) // renamed index to indices
{
DataTable1.Rows[index]["Column5"] = intUpdateValueColumnx;
DataTable1.Rows[index]["Column6"] = intUpdateValueColumny;
}
DataTable1.AcceptChanges();
如果你确定它只包含一个,你可以使用First
或Single
(多次抛出异常)。
int firstIndex = indices.First();
DataTable1.Rows[firstIndex]["Column5"] = intUpdateValueColumnx;
// ...