2012-07-12 56 views
0

如何以Modal方式打開表單的一個實例?如何在C#中創建一個ShowDialog()本身的表格

我試過this.ShowDialog()但它並沒有使表格顯示爲模態(您仍然可以訪問其他表格)。我想這是因爲它是它自己的父窗體,如果它顯示自己,但我不確定。

我的問題:

我做的2種形式的應用程序:

  1. MainForm
  2. LoginForm

MainForm創建的實例並打開LoginForm要求用戶認證。 LoginForm有一個計時器來定期檢查和登錄用戶 - 我想這個計時器模態地打開LoginForm。我知道這可以通過將計時器放在MainForm中來實現,但我想知道如何使表格ShowDialog()成爲它自己的一個實例。

在此先感謝。

+1

從我的經驗'ShowDialog'不會讓你訪問其他形式...... – Shai 2012-07-12 10:21:30

+1

能你表現出如何做到這一點?那麼你在'Application.Run'中做了什麼? – V4Vendetta 2012-07-12 10:26:49

+0

你爲什麼要在窗體中調用'ShowDialog',你想要顯示? – 2012-07-12 10:34:35

回答

2

,請務必讓ShowDialogInitializeComponent

public newForm() 
{ 
    InitializeComponent(); 
    this.ShowDialog(); 
} 

我的測試

我做了一個名爲Form2新類:

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     //this may not call in constractor 
     //InitializeComponent(); 
    } 

    public void ShowModalForm() 
    { 
     InitializeComponent(); 
     ShowDialog(); 
    } 
} 

,並啓動它的主,沒有任何父母它以模態啓動:

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     new Form2().ShowModalForm(); 
     //Application.Run(new Form1()); 
    } 
} 
+0

嗨,我在'InitializeComponent()'後面調用'ShowDialog()',它仍然只是有效地顯示()()的形式。 – James 2012-07-12 10:38:34

+0

我測試過了。它按照你的意願運作 – Ria 2012-07-12 11:13:40

+0

這很有效,超級。剛剛意識到我的問題可能歸結於'ShowDialog()'在一個新的線程中*感覺愚蠢*。謝謝 – James 2012-07-12 12:04:10

1

如果窗體是頂層窗口(沒有父窗體),窗體將不是模態。另一方面,如果您的表單將具有其他表單作爲父項,則它將在.ShowDialog()上以模態方式打開(阻止父項)。

+0

「LoginForm」形式確實有父級,它不是頂級的。 – James 2012-07-12 10:42:53

0

以下是您的選擇 - 在您的LoginForm上定義LoginExpired事件。在計時器滴答事件處理程序引發此事件:

public partial class LoginForm : Form 
{ 
    public event EventHandler LoginExpired; 

    public LoginForm() 
    { 
     InitializeComponent(); 
     timer.Start(); 
    } 

    private void timer_Tick(object sender, EventArgs e) 
    { 
     OnLoginExpired(); 
    } 

    protected virtual void OnLoginExpired() 
    { 
     if (Visible) 
      return; // if this form visible, then user didn't authenticate yet 

     if (LoginExpired != null) 
      LoginExpired(this, EventArgs.Empty); 
    }   
} 

然後在此事件訂閱您Main方法:

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

    using (LoginForm loginForm = new LoginForm()) 
    { 
     if (loginForm.ShowDialog() != DialogResult.OK) 
      return; 

     loginForm.LoginExpired += new EventHandler(loginForm_LoginExpired); 
     Application.Run(new MainForm()); 
    } 
} 

static void loginForm_LoginExpired(object sender, EventArgs e) 
{ 
    LoginForm loginForm = (LoginForm)sender; 
    if (loginForm.ShowDialog() != DialogResult.OK) 
     throw new NotAuthenticatedException(); 
} 
相關問題