【问题标题】:How to close Opened Form and open new Form on button click如何关闭打开的表单并在单击按钮时打开新表单
【发布时间】:2014-04-07 12:14:21
【问题描述】:

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

【问题讨论】:

  • @GrantWinney 我不知道打开了哪些窗口,因为登录表单窗口来自每个表单上都存在的菜单按钮单击事件

标签: c# winforms buttonclick


【解决方案1】:

试试这个:

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

OR 使用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 的更多信息。

【讨论】:

  • 在这个循环完成执行之后。我可以写代码来打开下一个表单吗。可以吗
  • 执行表单代码列表后,我编写了打开新表单的代码,即 Form1 frm=new Form1(); frm.show();现在我的 Form1 闪烁一秒钟并立即关闭..如何解决这个问题。我希望打开我的 Form1
  • 你的申请有MdiParent吗?
  • 不,先生,它的简单形式
  • 您可以关闭除登录表单外的所有表单。我想这就是你所追求的。
【解决方案2】:

您可以遍历 Application.OpenForms 集合并关闭您需要的。

【讨论】:

  • 如何知道哪个表单是打开和迭代的?
  • 该集合中的所有表单都已打开。请参阅@Raging Bull 示例
  • Application.OpenForms 中的所有表单都是打开的^^
【解决方案3】:

您不能按照之前回复中的建议使用 foreach 关闭表单。这是因为 foreach 不能用于更改枚举表单列表(当您 Close() 它们时,您将收到运行时错误)。即使你使用 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();
    }
}

登录表单代码如下:

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

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

【讨论】:

  • This is because foreach cannot be used to alter the enumerated forms list (when you Close() them, you will get a run-time error)??试试我的代码。
  • @Raging Bull:我没有说它不能完成......只是前面编写的代码不起作用..它会给出一个 InvalidOperation 异常,因为“集合已修改, 枚举操作可能无法执行”。你的代码更复杂。您将所有表单添加到列表中,然后关闭它们。相反,只需执行一个 for 循环并在一次操作中关闭它们。
  • @Dmitry:这是示例代码...在他的代码中,他将编写登录代码,这会将 bool 变量设置为 true...我只是在这里编写示例代码, 不是盲目的复制粘贴...
【解决方案4】:

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

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

【讨论】:

  • 我需要在哪里调用 Application_ApplicationExit
  • 你不需要在任何地方调用它。您可以将处理程序放在 LoginForm 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多