c# - 当 MessageBox 打开时(或 "closing"),防止父表单接收 KeyUp 事件

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

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

这是我的案例。

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

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

这里,Enter键导致冲突,因为当我打开删除确认MessageBox时,我按“Enter”,它会执行删除操作,但效果相同记录也在子表单中打开进行编辑(这显然会导致空指针,但我猜想从数据库中删除发生在记录被缓存以供打开之后)。

正如我之前链接的类似问题中提供的解决方案,我尝试设置一个表单级别标志,当打开 MessageBox 时该标志设置为 true,当用户单击"is"或“否”键时设置为 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;
}

谢谢!

最佳答案

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

尝试在表单中添加 keydown 事件来设置删除确认。

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

关于c# - 当 MessageBox 打开时(或 "closing"),防止父表单接收 KeyUp 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17761989/

相关文章:

c# - 类如何防止外部代码声明其类型的变量?

c# - 使用 OrderBy<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>)

wpf - 如何在 CheckedComboBoxEdit 中获取选定项?

c# WPF 更改 CheckBox 的复选颜色

visual-studio - 关闭后 Visual Studio 不保存 session 状态

visual-studio - 如何修复损坏的 Visual Studio 项目依赖项?

c++ - 没有 sln 文件时使用 Visual Studio 2015 打开解决方案/项目

c# - 访问多个文件

c# - .NET 中 DataTable 或其他复杂对象的最大大小

c# - 如何将分层数据数据绑定(bind)到 WPF TreeView?