2014-03-05 41 views
0

我目前有兩個Winforms窗體,其中一個是Login窗體。現在根據我的要求,如果用戶輸入了正確的憑據,那麼這兩個打開的窗體需要將被關閉,並應打開新的表格。 意味着我必須關閉打開的winforms並在登錄窗體的按鈕單擊事件中打開新的Winform。 我在這裏不知道到底是因爲登錄表單窗口從菜單按鈕點擊事件,存在各種形式的 請幫助me.Thanks提前到來其中窗戶打開..如何關閉打開的窗體並在按鈕上點擊打開新窗體

+0

你似乎已經知道該怎麼做。你卡在哪裏?添加一個按鈕?創建新表單的實例?當您關閉登錄表單時,程序是否結束? –

+0

@GrantWinney我不知道確切地打開了哪些窗口,因爲登錄表單窗口來自每個表單上的菜單按鈕單擊事件 – Ram

+0

爲什麼有人點擊菜單項以顯示登錄表單?當用戶啓動程序時,你不想一次性顯示登錄表單嗎? –

回答

0

試試這個

List<Form> openForms = new List<Form>(); 
foreach (Form f in Application.OpenForms) 
    openForms.Add(f); 
foreach (Form f in openForms) 
{ 
    f.Close(); 
} 

按你的要求,緊密所有的除了login窗體,然後顯示該窗體。

foreach (Form f in Application.OpenForms) 
    { 
     if(f.Name!="frmLogin") //Closing all other 
      f.Close();   //forms 
    } 

現在激活登錄表單。

frmLogin.Show(); 
frmLogin.Focus(); 

Application.OpenForms獲取應用程序擁有的開放表單集合。詳細瞭解Application.OpenForms

+0

此循環完成執行後。我可以編寫代碼以打開下一個表單。一切正常 – Ram

+0

執行完表單後,書面的代碼來打開新的窗體,即Form1 frm = new Form1(); frm.show();現在我的Form1閃爍一秒鐘並立即關閉..如何解決這個問題。我想要打開我的Form1 – Ram

+0

您是否有'MdiParent'的應用程序? –

0

您可以在Application.OpenForms收集和迭代關閉你需要的。使用for循環

foreach (Form f in Application.OpenForms) 
{ 
    f.Close(); 
} 

OR

for (int i = Application.OpenForms.Count - 1; i >= 0; i--) 
{ 
    Application.OpenForms[i].Close(); 
} 

OR創建表單列表:

+0

如何知道哪些表單是打開和迭代的? – Ram

+0

打開該集合中的所有表單。請參閱@Raging Bull示例 – mnieto

+0

Application.OpenForms中的所有表單均已公開^^ – Sebi

0

您無法使用foreach關閉窗體,如前面的回覆中所建議的那樣。這是因爲foreach不能用來改變枚舉窗體列表(當你關閉它們的時候,你會得到一個運行時錯誤)。即使你使用一個for循環,你必須檢查的主要形式也不會誤收...

for(int i=0; i< Application.OpenForms.Count; i++) 
{ 
    Form f = Application.OpenForms[i]; 
    if(f != this) 
     f.Close(); 
} 

相反,你可以嘗試下面的邏輯。 這兩種形式從哪裏加載?它來自一個主要形式嗎?我假設都使用Form.Show()方法顯示。

在登錄表單登錄按鈕處理程序中,我接受對主窗體的引用。當驗證成功時,我會在父窗體中調用一個函數LoginSuccessful(),它將遍歷打開的窗體並關閉它們。

public partial class FormMain : Form 
{ 
    LoginForm loginForm; 
    OtherForm otherForm; 

    public FormMain() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     loginForm = new LoginForm(this); 
     otherForm = new OtherForm(); 

     loginForm.Show(); 
     otherForm.Show(); 
    } 

    public void LoginSuccessful() 
    { 
     loginForm.Close(); 
     otherForm.Close(); 
     OtherForm thirdForm = new OtherForm(); 
     thirdForm.Show(); 
    } 
} 

LoginForm的如下代碼:

public partial class LoginForm : Form 
{ 
    FormMain parent; 
    bool bLoginSuccessful = false; 

    public LoginForm(FormMain parent) 
    { 
     InitializeComponent(); 
     this.parent = parent; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     bLoginSuccessful = true; 
     Thread.Sleep(5000); 
     if (bLoginSuccessful == true) 
      parent.LoginSuccessful(); 
    } 
} 

這應該可以幫助您解決問題... ...誠然,這是不是最好的方法......這一切都取決於你的方法。如果你的要求更詳細,我可以想出更好的方法。

+0

'這是因爲foreach不能用來改變枚舉窗體列表(當你關閉它們的時候,你會得到一個運行時錯誤)?試試我的代碼。 –

+0

切勿在UI線程中使用'Thread.Sleep'。 – Dmitry

+0

@Raging Bull:我沒有說它不能完成......只是之前編寫的代碼不起作用。它會給出一個InvalidOperation異常,因爲「集合已被修改,枚舉操作可能不會執行」 。你的代碼更復雜。您將所有表單添加到列表中,然後關閉它們。相反,只需執行for循環並在一次操作中關閉它們即可。 –

0

在你的登錄表單,使默認的構造函數私有,並添加一個新的構造和這樣一個私有成員:

private Form _callerform; 

private LoginForm() 
     { 
      InitializeComponent(); 
     } 

public LoginForm(Form caller) 
     { 
      InitializeComponent(); 
     } 

現在,在按鈕上LoginForm的單擊事件,嘗試這樣的事情:

 Form SomeOtherForm = new Form(); 
     SomeOtherForm.Show(); 
     // Hide login and caller form 
     Hide(); 
     _callerForm.Hide(); 

現在,您已隱藏了幾個表單並打開了一個新窗體。當用戶關閉應用程序時,您還需要關閉其他表單。所以,

void Application_ApplicationExit(object sender, EventArgs e) 
    { 
     foreach (Form form in Application.OpenForms) 
     { 
      form.Close(); 
     } 
    } 
+0

我需要在哪裏調用Application_ApplicationExit – Ram

+0

您無需在任何地方調用它。您可以將該處理程序放在LoginForm中。 – danish

相關問題