我找到了几个帖子"答案"对此,但他们都没有为我工作。为什么某些事情应该如此容易如此困难?
我想要的是回复某人检查/取消选中一列复选框。一种解决方案大部分时间都有效,但有时事件并未被触发。我在几个地方看过的那个建议是这样的:
private void dgv1_CurrentCellDirtyStateChanged(object sender, EventArgs e) {
if (dgv1.IsCurrentCellDirty) {
dgv1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
private void dgv1_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
// Do whatever I want to do.
}
不幸的是,CellValueChanged根本就没有被调用。 我已检查并仔细检查是否添加了两个侦听器:
dgv1.CellValueChanged += new DataGridViewCellEventHandler(dgv1_CellValueChanged);
dgv1.CurrentCellDirtyStateChanged += new EventHandler(dgv1_CurrentCellDirtyStateChanged);
我向这两个方法添加了print语句,以验证即使是CurrentCellDirtyStateChanged方法也永远不会调用CellValueChanged方法。我做错了什么?
修改 我正在使用DataTable与此DataGridView。听听那会更好吗?在我离开单元格之前,是否在DataTable中发生了变化?
答案 0 :(得分:1)
试一试。但这次是CellContentClick
事件。
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
switch (e.ColumnIndex)
{
case 0: //Where the DataGridViewCheckBoxColumn Index
dataGridView1[e.ColumnIndex, e.RowIndex].Value =
!(bool) dataGridView1[e.ColumnIndex, e.RowIndex].Value;
if ((bool)dataGridView1[e.ColumnIndex, e.RowIndex].Value)
{
//Something to do
}
break;
}
}
选项:您可以将DataGridViewCheckBoxColumn
属性设置为readonly = true
。
答案 1 :(得分:0)
我的工作实现也使用了这种方法,但它略有不同:
private void table_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
// Because I want to respond immediately to the user changing the state of one of the "excluded" cells,
// I have to detect the dirty state of such a cell changing, then call CommitEdit() in order to explicitly
// cause the CellValueChanged() event to be raised.
if (_table.CurrentCellAddress.X == _colExcluded.DisplayIndex)
{
_table.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
在这种情况下,_colExcluded.DisplayIndex
恰好就是我如何检查是否点击了正确的列。
与您的代码的不同之处在于,在调用CommitEdit()
之前,我不会检查当前单元格是否为脏。我认为这可能是个问题。