我在DataGridView中有一个复选框列,我想验证用户是否可以通过计算他们点击并决定的复选框的数量来选中复选框 然后禁用检查。
有人可以指导我如何有效地做到这一点吗?
答案 0 :(得分:1)
快速代码示例:
public partial class DGVCheckBoxTesting : Form
{
private const int MAX_CHECKS = 5;
public DGVCheckBoxTesting()
{
InitializeComponent();
this.dataGridView1.Columns.Add("IntColumn", "IntColumn");
this.dataGridView1.Columns.Add(new DataGridViewCheckBoxColumn { Name = "BoolColumn" });
for (int i = 0; i <= 10; i++)
{
this.dataGridView1.Rows.Add(i, false);
}
this.dataGridView1.CellContentClick += new DataGridViewCellEventHandler(dataGridView1_CellContentClick);
this.dataGridView1.CellContentDoubleClick += new DataGridViewCellEventHandler(dataGridView1_CellContentDoubleClick);
}
private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
{
this.ValidateCheckBoxState(e);
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
this.ValidateCheckBoxState(e);
}
private void ValidateCheckBoxState(DataGridViewCellEventArgs e)
{
if (e.ColumnIndex != 1) //bool column
{ return; }
this.dataGridView1.EndEdit();
bool value = (bool)this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
int counter = 0;
foreach (DataGridViewRow row in this.dataGridView1.Rows)
{
if (row.Cells[1].Value != null && (bool)row.Cells[1].Value)
{
counter++;
}
}
if (counter > MAX_CHECKS)
{
this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = false;
this.dataGridView1.EndEdit();
}
}
}
基本上,这段代码的作用是将一个Integer列和一个Bool列添加到DataGridView中。然后,在CellContentClick事件中,如果单击复选框列,则首先我们提交编辑(如果您不这样做,那么在确定是否选中该复选框时会遇到各种麻烦)。然后,我们遍历行并计算所有已检查的行。然后,如果数量大于我们想要允许的数量,我们只需将其设置为false,然后再次提交编辑。测试它,它的工作原理。可能不是最优雅的解决方案,但DGV对于复选框来说可能很棘手,所以我就是这样做的。
编辑:只是一个小编辑,我也加入了ContentDoubleClick事件,因为我注意到如果你快速点击单元格,你就能够击败验证。现在应该更好。