[英]Prevent Parent Form from receiving KeyUp event while MessageBox is open (or “closing”)
我的问题在某种程度上与此问题有关,但是建议的解决方案对我不起作用。
所以这是我的情况。
我在MDI家长中有一个孩子表格。 该窗体中包含Tab控件和一个GridView。 我在窗体本身的KeyUp
事件中添加了键盘快捷KeyUp
。 现在,当用户选择了Grid中的某一行并YESNO
Delete时 ,我使用YESNO
按钮执行MessageBox.Show()
以确认用户的操作。
此外,Form支持Enter (或Ctrl + O )键,如果在从网格中选择记录时用户单击它,它将以另一个子窗体打开Record进行编辑。
在这里, Enter键引起冲突,因为当我打开该删除确认MessageBox
并单击“ Enter”时,它会执行删除操作,但也会在子窗体中打开同一记录以进行编辑(这显然会导致NullPointers但我想从数据库中删除是在将记录缓存为打开之后发生的。
正如我先前链接的类似问题中提供的解决方案一样,我尝试设置一个窗体级别标志,该窗体级别标志在打开MessageBox时设置为true,在用户单击“是”或“否”键时设置为false,但是我不确定是否是否在代码中的适当位置设置标志。
PSA:我在窗体上也有Delete和Open作为按钮,因此我在Shortcuts上使用了相同的方法。
这是我的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事件,因此当您返回表单时,该按钮处于Down状态并释放它从而触发了KeyUp。
尝试在您的表单中添加一个keydown事件以设置deleteconfirm。
if ((e.Control && e.KeyCode == Keys.O) || e.KeyCode == Keys.Enter)
{
canDelete = true;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.