如何关闭打开的表单并在按钮单击时打开新表单

时间:2014-03-05 12:25:56

标签: c# winforms buttonclick

我目前有两个Winforms打开。两个中的一个是登录表单。现在根据我的要求,如果用户输入正确的凭据,则需要关闭这两个打开的表单并打开新表单。 意味着我必须关闭打开的winforms并在Login窗体的按钮单击事件上打开新的Winform。 这里我不确切知道哪些窗口是打开的,因为登录表单窗口来自每个表单上的菜单按钮单击事件 请帮帮我。谢谢。

4 个答案:

答案 0 :(得分:0)

您可以遍历Application.OpenForms集合并关闭所需内容。

答案 1 :(得分:0)

试试这个:

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

使用for循环:

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

创建表单列表:

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

答案 2 :(得分: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();
    }
}

这可以帮助你解决问题...当然,这不是最好的方法......这完全取决于你的方法。如果你的要求更详细,我可能会想出更好的方法。

答案 3 :(得分:0)

在您的登录表单中,将默认构造函数设为私有,并添加一个新构造函数和一个私有成员,如下所示:

private Form _callerform;

private LoginForm()
        {
            InitializeComponent();
        }

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

现在,在LoginForm上的click按钮事件中,尝试这样的事情:

        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();
        }
    }