在DataGridView中编辑复选框单元格时,消息框触发两次



我有一个带有绑定数据的DataGridView,但有一个复选框列未绑定,我正在跟踪自己。EditMode是以编程方式编辑的。当用户尝试禁用复选框时,我会弹出一个消息框,询问他们是否确定要禁用它。如果他们选择"是",我会禁用它。不,我会取消编辑。当他们选择"是"并且我更改了值时,消息框将再次启动。有人知道为什么会发生这种事吗?

这是有问题的代码:

private void dgv1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
        if (dgv1.BeginEdit(false))
            dgv1.EndEdit();
}
private void dgv1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
   if (dgv1.Columns[e.ColumnIndex].Name == "Enabled")
   {
     DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dgv1.Rows[e.RowIndex].Cells["Enabled"];
      if (checkCell.Value.Equals(checkCell.FalseValue))
      {
        checkCell.Value = checkCell.TrueValue;
      }
      else
      {
       DialogResult result = MessageBox.Show(this, "Are you sure you want to Disable this?", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
        if (result == DialogResult.No)
             e.Cancel = true;
        else
           checkCell.Value = checkCell.FalseValue;
      }
    }
private void dgv1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
  dgv1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}

我不确定为什么会发生这种情况,也许你可以在CurrentCellDirtyStateChanged上显示消息框,然后调用dgv1.CancelEdit()或CommitEdit()方法。

我也遇到过类似的情况,在checkxcell更改其值后,我不得不执行代码。您可以使用此代码在选中后取消选中它。这样,默认复选框功能会将该值设置为true,稍后如果未确认,则会将其设置回false。所以这有点脏,但应该有效。

void dgv1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
  if (dgv1.Columns[e.ColumnIndex].Name == "Enabled")
  {
    DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dgv1.Rows[e.RowIndex].Cells["Enabled"];
    if(!checkCell.Checked)
    {
       DialogResult result = MessageBox.Show(this, "Are you sure you want to Disable this?", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
       if (result == DialogResult.No)
       {
          checkCell.Value = checkCell.TrueValue;
       }
    }       
  }
}

CellValueChanged事件被长时间触发太晚(一旦单元格焦点丢失)。因此,在CellDirtyStateChanged 中提交您的更改

void dgv1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
  if (dgv1.IsCurrentCellDirty && dgv1.CurrentCell.ColumnIndex == dgv1.Columns["Enabled"].Index) 
  {
     dgv1.CommitEdit(DataGridViewDataErrorContexts.Commit); // raises the cellvaluechangedevent for checkboxes and comboboxes
  }
}

最新更新