看起来你通过改变方向回答了你自己的问题,但我想我会以你的方式提出一个潜在的解决方案,以防你想坚持使用 CheckBoxes。考虑这段代码:
private static int _previousClickedCheckBoxRowIndex;
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
var dgv = (DataGridView)sender;
if ((dgv.IsCurrentCellDirty) & (dgv.CurrentCell.OwningColumn == dgv.Columns["CheckBoxColumn"]))
{
dgv.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
var dgv = (DataGridView)sender;
if (dgv.Columns[e.ColumnIndex] == dgv.Columns["CheckBoxColumn"])
{
dgv.CellValueChanged -= dataGridView1_CellValueChanged;
if (_previousClickedCheckBoxRowIndex == e.RowIndex)
{
dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value =
!((bool)dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
dgv.RefreshEdit();
}
else
{
dgv.Rows[_previousClickedCheckBoxRowIndex].Cells["CheckBoxColumn"].Value = false;
_previousClickedCheckBoxRowIndex = e.RowIndex;
}
dgv.CellValueChanged += dataGridView1_CellValueChanged;
}
}
基本上,代码所做的是,通过跟踪用户在您的 中单击的最后一个 CheckBox 行索引DataGridView
,它会拒绝用户取消选中唯一当前选中的框,或者将框切换为专门检查它是否是之前未选中。
处理的原因CurrentCellDirtyStateChanged
是,默认情况下,选中时会DataGridView
离开编辑模式。CheckBoxCell
这会将其提交为对网格的更改。取消订阅然后重新订阅CellValueChanged
事件的原因是为了防止在以编程方式更改函数内部的值时出现无限循环。
确保将索引字符串“CheckBoxColumn”更改为网格中的列。
不是最优雅的代码,但它相当简短和甜蜜。如果您决定走那条路,希望它对您有用。