2014-03-05 43 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

相关问题