2013-07-03 5 views
0

У меня есть DataGridView со связанными данными, но есть столбец флажка, который не связан, что я отслеживаю себя. EditMode - EditProgrammatically. Когда пользователь пытается отключить этот флажок, я выхожу окно с сообщением, если они уверены, что хотят его отключить. Если они выберут «да», я отключу его. Нет, я отменяю редактирование. Когда они выбирают «да», и я меняю значение, окно сообщения снова срабатывает. Кто-нибудь знает, почему это происходит?Message Box стреляет дважды при редактировании ячейки CheckBox в DataGridView

Вот код в вопросе:

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); 
} 
+0

Это должно быть легко разрешено с некоторой отладкой. Поместите некоторую точку останова на 'if (checkCell.Value.Equals (checkCell.FalseValue))' и проверьте значение 'checkCell.Value' ... –

+0

Значения верны. Думаю, я, возможно, дважды позвонил в MessageBox.Show. Тем не менее, это довольно грязный способ сделать это. – PattersonWR

ответ

0

я не знаю, почему это происходит, может быть, вы можете просто показать MessageBox на 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 
    } 
} 
+0

Окно сообщения появляется, как только я включаю этот флажок. Я должен был изменить, если (checkCell.Checked), если (! CheckCell.Checked). Также он не устанавливает значение обратно, если я не хочу его отключать. – PattersonWR

+0

Да, это должно быть, если (! CheckCell.Checked), и это должен быть checkCell.Value = checkCell.TrueValue; – Koryu

Смежные вопросы