我有一个简单的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。
所以问题是,在视觉上勾选了复选框,但是在代码中,除非我改变焦点,否则最后一个复选框就不会被选中。
答案 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);
}
}