2009-06-17 68 views
8

我正在努力尋找一種方法來創建我想要使用C#的表單功能。從外部線程關閉模式對話框 - C#

基本上,我想要一個具有指定超時時間的模式對話框。看起來這應該很容易做到,但我似乎無法完成它的工作。

一旦我呼叫this.ShowDialog(parent),程序流程停止,並且我沒有辦法在用戶沒有先點擊按鈕的情況下關閉對話框。

我嘗試使用BackgroundWorker類創建一個新的線程,但我無法讓它關閉另一個線程上的對話框。

我失去的東西在這裏很明顯?

感謝您提供的任何見解。

回答

11

使用System.Windows.Forms.Timer。將其Interval屬性設置爲您的超時時間,並將其Tick事件處理程序設置爲關閉對話框。

partial class TimedModalForm : Form 
{ 
    private Timer timer; 

    public TimedModalForm() 
    { 
     InitializeComponent(); 

     timer = new Timer(); 
     timer.Interval = 3000; 
     timer.Tick += CloseForm; 
     timer.Start(); 
    } 

    private void CloseForm(object sender, EventArgs e) 
    { 
     timer.Stop(); 
     timer.Dispose(); 
     this.DialogResult = DialogResult.OK; 
    } 
} 

計時器在UI線程上運行,因此可以安全地從tick事件處理程序關閉窗體。

11

您需要調用Close方法創建窗體的線程上的接近:

theDialogForm.BeginInvoke(new MethodInvoker(Close)); 
3

如果你真的想要一個模態對話框,那麼我發現這是目前最好的解決方案:http://www.codeproject.com/KB/miscctrl/CsMsgBoxTimeOut.aspx(閱讀評論部分的一個小修改)。

如果你想以模態方式顯示你自己的表格,那麼adrianbanks的解決方案是最好的。