c # DataGridView флажки не будут проверены - PullRequest
0 голосов
/ 25 января 2019

У меня есть простой DataGridView, который использует таблицу Orders (OrderID, CustomerID, ShipName) из базы данных northwind . После начальной загрузки я добавляю новый столбец в каждую строку с флажок на нем. Теперь мой интерфейс выглядит как это .

Код для добавления дополнительного столбца с флажком.

DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn();
checkColumn.Name = "Delete";
checkColumn.HeaderText = "Delete";
checkColumn.Width = 50;
checkColumn.ReadOnly = false;
dataGridView1.Columns.Add(checkColumn);

Кроме того, у меня есть кнопка удаления, которая при нажатии должна удалять все строки с установленным флажком.

for (int i = dataGridView1.Rows.Count-1; i >=0 ; i--)
{
    DataGridViewRow row = dataGridView1.Rows[i];
    bool isChecked = dataGridView1[3, i].Value != null && (bool)dataGridView1[3, i].Value != false;
    if (isChecked)
    {
        dataGridView1.Rows.RemoveAt(i);
    }
}

Однако каждый раз, когда я нажимаю на некоторые флажки, а затем на кнопку «Удалить», последний нажатый всегда не удаляется.

После некоторой отладки я обнаружил, что если я нажимаю на некоторые флажки, затем нажимаю в любом месте пользовательского интерфейса, а затем на кнопку удаления, он работает как задумано.

Итак, это известная ошибка? Я делаю что-то не так?

UPDATE

Добавлен счетчик в метод удаления, чтобы я мог подсчитать, сколько флажков помечено и перейти к другому тесту:

1: Я нажал на первые два флажка, а затем на кнопку Удалить. Первая строка была удалена, счетчик был 1.

2: Я нажал на первые два флажка и затем снаружи в пустом месте пользовательского интерфейса, а затем на кнопку delete. Оба отмеченных ряда были удалены. Счетчик был 2.

Итак, проблема в том, что визуально флажки отмечены галочкой, но в коде последний - нет, если я не изменил фокус.

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Могу ли я предложить вам изменить свой подход? я думаю, что цикл может работать не так, как задумано

        List<int> indexesToDelete = new List<int>();
        dgv.Rows.Cast<DataGridViewRow>().ToList().ForEach(x =>
        {
            if (x.Cells[3].Value != null && (bool)x.Cells[3].Value != false)
            {
                indexesToDelete.Add(x.Index);
            };
        });
        indexesToDelete.Reverse();
        indexesToDelete.ForEach(i => dgv.Rows.RemoveAt(i));

если вы хотите продолжить свой подход, я бы предложил вместо использования removeAt использовать remove и дать строку вместо индекса

0 голосов
/ 25 января 2019

Как насчет обработчика событий, если при щелчке по любой ячейке привязать ее к имени / номеру столбца, а затем удалить индекс:

   private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 3)
        {

/* any aditional verifications, can be added, then remove from the index selected */

            dataGridView1.Rows.RemoveAt(e.RowIndex);
        }
    }
0 голосов
/ 25 января 2019
foreach (DataGridViewRow row in dataGridView1.Rows)
{
     if (Convert.ToBoolean(row.Cells[3].Value)) //Column Delete
     {
          // what you want to do
     }
}

Вы забыли преобразовать значение в логическое значение, используя Convert.ToBoolean()

...