Как получить индекс в Datatable

1

Мне нужна помощь здесь, например, у меня есть следующий элемент в моем 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'. Как получить индекс?

Есть ли другой способ достичь этого?

Заранее спасибо...

Теги:
linq
datatable

2 ответа

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;
// ...
  • 0
    Спасибо ... работает отлично ....
0

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

Это обновит все строки, соответствующие вашим критериям. Их могло быть много или вообще не было.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню