c#DataGridView复选框不会被选中

时间:2019-01-25 14:18:48

标签: c# datagridview northwind

我有一个简单的DataGridView,它使用northwind database中的表Orders(OrderID,CustomerID,ShipName)。在初始加载后,我向每行添加了一个新列,并带有一个复选框。现在我的用户界面看起来像this

用于添加带有复选框的额外列的代码。

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

但是,每次我单击一些复选框,然后单击“删除”按钮时,最后单击的那个始终不会被删除。

经过调试后,我发现如果单击某些复选框,然后单击UI中的其他任何位置,然后在按钮上删除,它将按预期工作。

那么,这是一个已知的错误吗?我做错什么了吗?

更新

在delete方法中添加了一个计数器,这样我就可以计算出勾选了多少复选框并进行其他测试了:

1 :我点击了前两个复选框,然后单击了删除按钮。第一行被删除,计数器为1。

2 :我单击了前两个复选框,然后在UI的空白处单击了外部,然后单击了delete按钮。两个被选中的行都被删除了。计数器为2。

所以问题是,在视觉上勾选了复选框,但是在代码中,除非我改变焦点,否则最后一个复选框就不会被选中。

3 个答案:

答案 0 :(得分:0)

foreach (DataGridViewRow row in dataGridView1.Rows)
{
     if (Convert.ToBoolean(row.Cells[3].Value)) //Column Delete
     {
          // what you want to do
     }
}
  

您忘记了使用Convert.ToBoolean()

将值转换为布尔值

答案 1 :(得分:0)

我可以建议您更改方法吗?我认为for循环可能无法按预期工作

        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并给出行而不是索引

答案 2 :(得分:0)

关于何时单击任何单元格的事件处理程序,然后将其绑定到列名/数字,然后删除索引,该如何处理:

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