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

Kus*_*hal 2 c# wpf keyboard-shortcuts visual-studio winforms

我的问题与问题有些相关,但建议的解决方案对我不起作用。

所以这是我的情况。

我在 MDI 父级中有一个子窗体。表单中包含 Tab 控件和一个 GridView。我KeyUp在表单本身的事件中添加了键盘快捷键。现在,当用户选择 Grid 中的一行并点击时Delete,我会MessageBox.Show()使用YESNO按钮来确认用户的操作。

此外,表单支持Enter(或Ctrl+ O) 键,如果用户在从网格中选择记录时点击它,它会在另一个子表单中打开记录进行编辑。

在这里,Enterkey 引起冲突,因为当我MessageBox打开删除确认并点击“Enter”时,它执行删除操作但也在子表单中打开相同的记录进行编辑(这显然会导致 NullPointers 但我在记录被缓存以供打开之后发生从数据库中猜测删除)。

作为我之前链接的类似问题中提供的解决方案,我尝试设置一个表单级别标志,该标志在打开 MessageBox 时设置为 true,并在用户单击 Yes 或 No 键时设置为 false,但我不确定我是否“ m 是否在代码中的适当位置设置标志。

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

以及以下删除记录的方法

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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Say*_*yse 5

我认为您的问题是 messagebox 处理 KeyDown 事件,因此当您返回表单时,按钮处于按下状态并释放它从而触发您的 KeyUp。

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

 if ((e.Control && e.KeyCode == Keys.O) || e.KeyCode == Keys.Enter)
    {
        canDelete = true;
    }
Run Code Online (Sandbox Code Playgroud)