我的问题在某种程度上与this问题有关,但建议的解决方案对我不起作用。
所以这是我的情况。
我在MDI父母中有一个子表单。该表单包含Tab控件和GridView。
我在表单本身的KeyUp
事件中添加了键盘快捷键。现在,当用户选择了Grid中的一行并点击 Delete 时,我会MessageBox.Show()
使用YESNO
按钮确认用户的操作。
此外,Form支持 Enter (或 Ctrl + O )键,如果用户在从网格中选择记录时命中它,则在另一个子表单中打开Record以进行编辑。
这里, Enter 键导致冲突,因为当我打开删除确认MessageBox
时,我点击“Enter”,它执行删除操作,但同样的记录也是在子窗体中打开进行编辑(这显然可以导致NullPointers,但我想从记录缓存后打开数据库时会发生删除)。
正如我之前链接的类似问题中提供的解决方案,我尝试设置一个表单级别标志,当打开MessageBox时设置为true,当用户单击是或否键时设置为false,但我不确定如果我在代码中的正确位置设置标记。
PSA:我在表单上也有删除和打开按钮,因此我在快捷方式上使用相同的方法。
这是我的表格的KeyUp事件
private void FormAnalystOpenReport_KeyUp(object sender, KeyEventArgs e)
{
if (((e.Control && e.KeyCode == Keys.O) || e.KeyCode == Keys.Enter) &&
!this.DELETE_CONFIRM_OPEN)
{
rtBtnOpen_Click(sender, e);
}
else if (e.KeyCode == Keys.Delete)
{
rtBtnDelete_Click(sender, e);
}
}
以及删除记录的方法
private void rtBtnDelete_Click(object sender, EventArgs e)
{
DataGridViewRow row = (DataGridViewRow)rtDataGrid.SelectedRows[0];
int delete_id = int.Parse(row.Cells[0].Value.ToString());
this.DELETE_CONFIRM_OPEN = true;
DialogResult feedback = MessageBox.Show(this,"Are you sure you want to delete selected record?", "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if(feedback == DialogResult.Yes)
{
if (this.db.DeleteRecordById(delete_id)) //Would return true for successful delete of record, false otherwise.
{
//Code to reload Grid Data with updated Records list.
}
else
{
MessageBox.Show(this, "Failed to delete record!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
this.DELETE_CONFIRM_OPEN = false;
}
谢谢!
答案 0 :(得分:4)
我认为您的问题是,消息框会关闭KeyDown事件,因此当您返回到表单时,按钮会关闭,然后您将其释放,从而触发您的KeyUp。
尝试在表单中添加keydown事件以设置deleteconfirm。
if ((e.Control && e.KeyCode == Keys.O) || e.KeyCode == Keys.Enter)
{
canDelete = true;
}