Необходимо получить массив выбранных DataGridViewCheckBoxColumn

Пользователь отмечает необходимые строки. Мне нужно считать массив id отмеченных. Не отмеченные не интересуют

SqlDataAdapter da = new SqlDataAdapter("USE BD_THREAT SELECT NAME, SOURSE_OF_THREAT, OBJECT_OF_INFLUENSE FROM THREATS", cn);
DataSet ds = new DataSet();
cn.Open();
da.Fill(ds, "THREATS");
DataGridViewCheckBoxColumn checkboxcolumn = new DataGridViewCheckBoxColumn();
checkboxcolumn.HeaderText = "";
dataGridView1.Columns.Insert(dataGridView1.ColumnCount, checkboxcolumn);
dataGridView1.DataSource = ds.Tables["THREATS"];           
cn.Close(); 

Ответы (1 шт):

Автор решения: Alexander Petrov

Не работайте напрямую с DataGridView.
Вы же используете привязку данных, вот и работайте с DataTable.

Имеется поле:

private DataTable threats;

DataSet не нужен, т. к. вы используете одну таблицу.
Загружаем данные:

threats = new DataTable();
da.Fill(threats);

Добавляем в DataTable булеву колонку:

threats.Columns.Add("Check", typeof(bool));

Делаем привязку. Булева колонка будет отображаться в гриде в виде чекбоксов.

dataGridView1.DataSource = threats;
//dataGridView1.Columns["Check"].HeaderText = "";

При желании можно изменить текст заголовка.


Теперь копируем отмеченные колонки в новый DataTable.

var selected = threats.AsEnumerable()
    .Where(row => row.Field<bool?>("Check") == true);

if (selected.Any())
{
    var result = selected.CopyToDataTable();

    // Убираем булев столбец, если он не нужен.
    result.Columns.Remove("Check");

    // Как-то используем выбранные данные.
    // Например, привязываем к другому гриду.
    dataGridView2.DataSource = result;
}
→ Ссылка