[英]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.