我写了一个C#Windows Form程序,我想要的效果如下。
当用户单击All
复选框时,将检查该行的所有复选框。另一方面,如果用户再次单击All
复选框,则将取消选中该行的所有复选框。此外,如果用户取消选中任何复选框(独占All
复选框),则必须取消选中All
复选框。但是,当任何框的值发生更改时,将调用CellValueChanged
。这很难处理。并且,我总是通过我的代码获得无限循环。任何人都可以解决它吗?非常感谢!!
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 1 && e.RowIndex >= 0)
{
if (Convert.ToBoolean(dataGridView1.Rows[e.RowIndex].Cells[1].Value))
{
//check all the Checkboxs
for (int i = 2; i < 26; i++)
dataGridView1.Rows[e.RowIndex].Cells[i].Value = true;
//if the other row all checked, unchecked it all
for(int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (i == e.RowIndex)
continue;
if(Convert.ToBoolean(dataGridView1.Rows[i].Cells[1].Value))
{
for(int j = 1; j < dataGridView1.Rows[i].Cells.Count; j++)
{
dataGridView1.Rows[i].Cells[j].Value = false;
}
}
}
}
else
for (int i = 2; i < 26; i++)
dataGridView1.Rows[e.RowIndex].Cells[i].Value = false;
}
else if(e.ColumnIndex > 1 && e.RowIndex >= 0)
{
bool flag = true;
for (int i = 2; i < dataGridView1.Rows[e.RowIndex].Cells.Count; i++)
{
if (!Convert.ToBoolean(dataGridView1.Rows[e.RowIndex].Cells[i].Value))
flag = false;
}
if (flag)
dataGridView1.Rows[e.RowIndex].Cells[1].Value = false;
else
dataGridView1.Rows[e.RowIndex].Cells[1].Value = true;
}
}
答案 0 :(得分:2)
无限循环的问题是dataGridView1_CellValueChanged每次调用它自己。
我建议将lock(object)添加到dataGridView1_CellValueChanged,在这种情况下,检查所有行是否全部检查的调用都不会被调用,直到所有复选框都标记为已选中。