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

本文关键字:关闭 事件 KeyUp 窗体 MessageBox 打开 | 更新日期: 2023-09-27 18:23:58

我的问题在某种程度上与这个问题有关,但建议的解决方案对我不起作用。

这是我的案例。

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

此外,Form支持Enter(或Ctrl+<kbd&O>

在这里,Enter键会导致冲突,因为当我打开删除确认MessageBox,并点击"Enter"时,它会执行删除操作,但也会在子窗体中打开相同的记录进行编辑(这显然会导致NullPointers,但我猜在缓存记录以供打开后会从数据库中删除)。

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

PSA:我在表单上也有"删除"answers"打开"按钮,因此我在快捷方式上使用相同的方法。

这是我的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;
}

谢谢!

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

我认为你的问题是messagebox会关闭KeyDown事件,所以当你返回到表单时,按钮是Down,你释放它,从而触发你的KeyUp。

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

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