Добавьте логический столбец в таблицу данных, затем выполните:
foreach(DataRow ro in YourDataTableNotYourDataGridView.Rows){
if((bool)ro["BOOLEAN COLUMN NAME HERE"]){
//do something
int id = (int)ro["id"];
//but if you're manipulating the data, just do it directly, don't collect the id
ro["name"] = "John";
//the only thing you can't do, is delete the row from the table, because your enumerating the table
//if you want to do that, use a regular for loop (with an index int) in reverse order
}
}
Пользователь отметит соответствующие строки с помощью DGV, в результате чего логический параметр станет установленным в модели данных, а затем вы используете его
Вы сосредотачиваетесь на сетке данных, как если бы это было чем-то, что содержит данные * и должно программно управляться и взаимодействовать;это не должноDGV - это просто инструмент, который пользователь может использовать для просмотра и манипулирования моделью данных.Программно вы должны обращаться к модели данных и манипулировать ею, а не к представлению / контроллеру
*, которые вы сказали «сначала я заполняю DGV данными» - это неправильный способ оценки.DGV - это представление данных, которые живут в других местах, оно не заполняется непосредственно какими-либо данными, и не должно.Основная концепция теории MVC заключается в том, что проблемы модели, представления и контроллера остаются разделенными.Из практических соображений бывает, что V и C часто выполняются одним и тем же, но M остается отличным
Кроме того, ваша жизнь станет намного проще, если вы будете использовать строго типизированные наборы данных для этого, а также значительно меньше приведения и столбцов.доступ по имени-в-строке:
foreach(TypedDataRow ro in typedDataTable){
if(ro.BoolColumnName)
//do something
}
Все становится проще и компактнее, если вы тоже задействуете LINQ:
List<int> segurosId = datatable.Where(r => r.BoolColumn).Select(r => r.id).ToList();
Эта строка кода работает так же, как ваша;
List<int> segurosID = new List<int>(); foreach (DataGridViewRow dc in SegurosDataGridView.Rows) { if (dc.Cells["Anular"].Value != null) { if ((Boolean)dc.Cells["Anular"].Value == true) { segurosID.Add(Convert.ToInt32(dc.Cells["Seguro"].Value)); } } }
Конечная точка примечания;просто переберите данные и измените данные напрямую;не вдавайтесь в какой-то обходной метод итерации данных, поиска логических значений, извлечения идентификаторов, использования этих идентификаторов для извлечения каждой строки, изменения строки. Возможно, вам придется это сделать, если вы совершаете ошибку, пытаясь найти что-то новое.Сетка данных выглядит так, как если бы она была хранилищем данных, но ключевая концепция этого ответа заключается в том, чтобы вы попали в MVC и поняли разделение, программно изменив данные напрямую и предоставив пользователю возможность не программно изменять данные через сетку.В качестве крайней аналогии, если бы вы писали программу, которая обновляла базу данных, вы просто обновили бы базу данных, не установили бы на компьютер Sql Server management Studio, а затем использовали бы SendKeys для управления им и обновления базы данных.Точно так же вы не должны приступать к манипулированию данными в таблице данных путем программного взаимодействия с представлением таблицы, к которому эти данные подключены