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