簡體   English   中英

阻止父窗體在MessageBox打開(或“關閉”)時接收KeyUp事件

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM