0

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

这是有问题的代码:

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);
}
4

1 回答 1

2

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

我有类似的情况,我必须在复选框单元更改其值后执行代码。选中后,您可以使用此代码取消选中它。这样,默认复选框功能将值设置为 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
  }
}
于 2013-07-03T15:46:11.947 回答