2012-04-28 27 views
3

我有一個窗體,在其他控件中,有一個TextBox字段,可以由用戶選擇填充。
還有一個btn提交按鈕執行所需的操作並關閉窗體。
在其代碼中,我檢查是否存在評論,如果不是這樣,請詢問用戶是否在退出之前填寫它。
我使用bool AskToFillCommentIfNeeded()函數顯示一個MessageBox,要求用戶在退出之前可選地填充註釋,如果這尚未完成。
如果用戶回答是,則返回true,否則返回false。
如果用戶點擊是,我必須退出提交功能而不關閉表單,所以用戶可以輸入評論,然後再次按提交按鈕。如何在表單爲模態時退出函數而不退出表單?

的[編輯]代碼是這樣的:

private void btnSubmit_Click(object sender, EventArgs e) 
{ 
    // ask user if he wants to fill the comment : if so, exit this function 
    if (AskToFillCommentIfNeeded()) { return; }; 

    // ... save data and exit form ... 
} 

我使用此代碼在非模態形式,它按預期工作。
但是當我嘗試在一個模式形式btnSubmit按鈕DialogResult屬性設置爲OK使用它,它 不能按預期工作:
而不只是退出事件接收器,它會關閉形式 不保存數據。

我編了一個(笨拙)的解決方法,使用這樣的布爾標誌:

private bool isBusy = false; 
private void btnSubmit_Click(object sender, EventArgs e) 
{ 
    // clumsy attempt to avoid form exit : 
    isBusy = true; 

    // ask user if he wants to fill the comment : if so, exit this function 
    if (AskToFillCommentIfNeeded()) { return; }; 

    isBusy = false; 

     // ... save data and exit form ... 
} 

因此,如果執行return語句,我攔截_FormClosing事件 並取消它,如果設置了標誌爲true:

private void FDialog_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    // abort closing if flag is set 
    e.Cancel = isBusy; 
} 

這樣的工作,但它不盡人意。
有沒有更好的方法來實現相同的行爲?
我正在使用C#Express 2010。
預先感謝您。

傑克·格里芬

+0

感謝您的及時答覆。 – 2012-04-28 11:15:16

+0

糟糕!錯誤的評論! – 2012-04-28 12:10:45

+0

您可以刪除評論。而且你不必感謝每一張海報。 – 2012-04-28 12:36:42

回答

3

只需設置窗體的DialogResult屬性返回到無以防止關閉對話框:

private void btnSubmit_Click(object sender, EventArgs e) 
{ 
    if (AskToFillCommentIfNeeded()) { 
     this.DialogResult = DialogResult.None; 
     return; 
    } 

    // ... save data and exit form ... 
} 
+0

感謝您的及時答覆。 – 2012-04-28 12:11:02

+0

這樣一個簡單的答案,但我完全錯過了!謝謝。 :) – 2012-08-07 15:08:06

1

設置button.DialogResult = None並在button.Click事件手動分配form.DialogResult財產。

+0

感謝您的及時答覆。 – 2012-04-28 12:10:51

+0

這工作,但不是正確的解決方案。確定按鈕不再看起來像對話框的默認按鈕,請注意丟失的重邊框。 – 2012-04-28 12:57:05

0

注意:我現在要發佈這個,但在論壇上新出現
我必須等待8個小時才能回答我自己的問題。
儘管如此,我覺得一個帖子比在這種情況下對每個回答留下評論 要好。
(我的意思是,我的感謝是立即聯繫你:-))。

感謝您提供比光線更快的答案!
他們非常有啓發性。
@Hans Passant:這正是我之後的解決方案。
@mrtofigh:改變按鈕。對話結果不成功,它必須是形式。DialogResult。
@亨克霍爾特曼:你對標題欄中的關閉按鈕是正確的。
如果用戶點擊它,應用程序將假定用戶不打算 提交任何東西。
爲了保證這一點,我將添加以下代碼:

private void FDialog_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    // intercept form closing from Close box in title bar 
    if (e.CloseReason == CloseReason.UserClosing) 
     { 
      e.Cancel = !ConfirmFormExit(); 
     } 
} 

其中ConfirmFormExit()是顯示一個消息,詢問用戶是否希望不提交退出和是返回true一個布爾函數。

因此,該代碼將是:

private void btnSubmit_Click(object sender, EventArgs e) 
{ 
    // avoid form exit right now 
    this.DialogResult = DialogResult.None; 

    // ask user if he wants to fill the comment : if so, exit this function 
    if (AskToFillCommentIfNeeded()) { return; }; 

    // now is safe to return dialog result 
    this.DialogResult = DialogResult.OK; 

    // ... save data and exit form  
} 

我測試了它和它的作品就好了。
再次感謝您。
傑克