在MessageBox打开(或“关闭”)时阻止父窗体接收KeyUp事件

时间:2013-07-20 11:53:14

标签: c# wpf visual-studio winforms keyboard-shortcuts

我的问题在某种程度上与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;
}

谢谢!

1 个答案:

答案 0 :(得分:4)

我认为您的问题是,消息框会关闭KeyDown事件,因此当您返回到表单时,按钮会关闭,然后您将其释放,从而触发您的KeyUp。

尝试在表单中添加keydown事件以设置deleteconfirm。

 if ((e.Control && e.KeyCode == Keys.O) || e.KeyCode == Keys.Enter)
    {
        canDelete = true;
    }