[C#,Visual Studio 2008,Windows 7 64]
我的课堂上有一个DataGridView。此数据网格视图使用DataGridViewCheckBoxColumn,因此每个单元格都包含一个复选框。
这是其中一行的屏幕截图:
我希望能够检测用户是否选择了单元格(在单元格中的某个位置,但不在复选框的顶部)。我还想检测用户是否选中了该复选框。为此,我的代码必须为这两个事件设置回调:
this.CellClick += cellClick; // callback when the user selects a cell
this.CellContentClick += cellContentClick; // callback when the user selects a checkbox
以下是回调方法:
private void cellContentClick(object sender, DataGridViewCellEventArgs e)
{
toggleCellCheck(e.RowIndex, e.ColumnIndex);
}
private void cellClick(object sender, DataGridViewCellEventArgs e)
{
toggleCellCheck(e.RowIndex, e.ColumnIndex);
}
private void toggleCellCheck(int row, int column)
{
bool isChecked = (bool)this[column, row].EditedFormattedValue;
this.Rows[row].Cells[column].Value = !isChecked;
}
(注意:如您所见,toggleCellCheck方法获取复选框值并将其切换为选中->未选中或未选中->选中。)
当用户单击不是复选框的单元格中的任何位置时,只会触发一个回调,cellClick。随后调用toggleCellCheck方法并翻转复选框状态。
这是我想要的确切行为。
我遇到的问题是,当用户直接单击复选框时,两个事件都按以下顺序触发:cellClick然后cellContentClick。
执行的两个回调都会导致复选框选中状态在第一个回调之后切换,然后在第二个回调之后再次切换。最终结果当然是复选框选中状态没有改变。
有什么方法可以配置DataGridView类来阻止两个回调被触发?或者,有没有一种方法可以检测(在cellContentClick方法中)这是第二个回调,或者回调是通过单击复选框生成的,然后直接退出而不调用toggleCellCheck?
我在想类似以下的事情:
private void cellContentClick(object sender, DataGridViewCellEventArgs e)
{
// if sender/sender child/etc. is of type checkbox then return because
// _cellClick_ has already been called to change the checkbox checked property
// something like the following:
//
// if (typeof(sender) == CheckBox) return;
// else toggleCellCheck(e.RowIndex, e.ColumnIndex);
}
谢谢!
简