Мне нужна помощь здесь, например, у меня есть следующий элемент в моем datatable
Колонка 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();
Это не работает, потому что аргумент 1: невозможно преобразовать из 'System.Data.EnumerableRowCollection' в 'int'. Как получить индекс?
Есть ли другой способ достичь этого?
Заранее спасибо...
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;
// ...
index
должен быть int
который представляет позицию или "индекс" строки, которую вы хотите изменить.
Вы устанавливаете 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();
Это обновит все строки, соответствующие вашим критериям. Их могло быть много или вообще не было.