在DataGridView中编辑CheckBox单元格时,消息框闪烁两次

时间:2013-07-03 14:12:07

标签: c# winforms datagridview

我有一个带有绑定数据的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);
}

1 个答案:

答案 0 :(得分:0)

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

我有类似的情况,我必须在checkboxcell更改其值后执行代码。您可以使用此代码在选中后取消选中它。 这样,默认情况下,该值设置为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
  }
}