【问题标题】:Winform Forms Closing and opening a new formWinforms 表单关闭和打开一个新表单
【发布时间】:2010-12-13 05:56:41
【问题描述】:
1. frmHome frm = new frmHome();
   frm.Show();
   this.Close();

我正在从LoginForm 打开HomeForm。在LoginFormform_closed 事件中,我调用Application.Exit()。这允许您打开LoginForm 并通过单击X 按钮退出应用程序。

问题是当我从LoginForm 移动到HomeForm 并调用this.Close() 时,LoginFormform_closed 事件触发并且应用程序被关闭。

我一次只能显示一个表格。

【问题讨论】:

    标签: c# winforms forms


    【解决方案1】:

    您可以在LoginForm 中使用布尔值(全局变量)作为退出标志

    将其初始化为:

    exit = true;//in constructor
    

    关闭前设置为false:

    frmHome frm = new frmHome();
    frm.Show();
    exit = false;
    this.Close();
    

    form_closed:

    if(exit) Application.Exit();
    

    如果用户使用'X' 按钮关闭表单,exit 将具有值true,并且将调用Application.Exit()

    编辑:

    上述方法不起作用,因为LoginFormApplication.Run(loginForm) 使用的主要形式。

    2 条建议:

    带有exit 标志:

    替换

    Application.Run(new LoginForm())
    

    通过

    LoginForm loginFrm = new LoginForm();
    loginFrm.Show();
    Application.Run();
    

    没有exit标志:

    替换为您当前的代码:

    frmHome frm = new frmHome();
    frm.Show();
    this.Close();
    

    通过

    frmHome frm = new frmHome();
    this.Visible = false;
    frm.ShowDialog();
    this.Close();
    

    【讨论】:

    • 谢谢,即使我想过有一个标志,但不知何故这对我不起作用,无论如何它都会关闭应用程序。如果您有工作代码,可以与我分享。提前感谢您的帮助。
    • 问题是frm.Show() 将立即返回,LoginForm.Close() 将终止程序。我会建议使用frm.ShowDialog() 来解决这个问题,它会等到新表单关闭后再关闭LoginForm。但坦率地说,你在做什么并不干净。您能否详细解释整个问题或发布更多代码以便我们了解您的问题。
    【解决方案2】:

    在program.cs中:

    void Main() {
      frmLogin fl = new frmLogin();
      if (fl.ShowModal() == DialogResult.Ok) {
        frmHome fh = new frmHome();
        fh.Show();
      }
    }
    

    【讨论】:

    • 对不起,我有多个表格,我需要一个接一个地显示。感谢您的帮助,但无法使用这段代码。
    • @Karthick。这段代码完全符合您的要求。首先它显示了 frmLogin 表单。当 frmLogin 被关闭时(例如,通过按 OK),表单消失并显示 frmHome。我在 frmLogin 上使用 ShowModal 方法 - 这意味着在表单关闭之前代码不会继续。
    • @Karthick:AngryHacker 的建议非常好,如果这不能满足你,你要么不明白你在做什么,要么应该完全重写你的问题让我们理解。
    • 我喜欢这种技术。也适用于 frmHome button_click。我首先认为它可能会执行多个 frmHome 实例,但一切都很好。
    【解决方案3】:

    试试看它可能对你有帮助

    frmHome frm = new frmHome();
    this.hide()
    frm.ShowDialog();
    this.Close();
    

    【讨论】:

      【解决方案4】:

      您可以强制表单隐藏,而不是关闭。 而不是捕捉 form_closed 事件,捕捉 form_closing 事件。 它看起来像这样。

      private void LoginFrm_Closing(object sender, FormClosingEventArgs e)
      {
          e.Cancel = true;
          this.Hide();
          frmHome frm = new frmHome();
          frm.Show();
      }
      

      这将保持两个打开,但只有一个可见。 在 frmHome 的某个地方,可能是一个保存 LoginFrm 的公共变量,因此您可以使用 Hide() 在两者之间切换;和显示(); (以及您可能希望添加的任何其他表格)

      编辑:语法。

      【讨论】:

        【解决方案5】:

        您需要做的就是它可以毫无问题地关闭 2 个表单。 Form1 fin = new Form1(); fin.Close(); this.Visible = false; Form2 获胜 = 新 Form2(); win.Visible = true;

        【讨论】:

          【解决方案6】:

          实现此目的的一种方法:

          1. 在启动时打开主窗体。
          2. 隐藏它。 (实际上是可选的,但如果您确实不能显示多个表单,则不适合您。)
          3. 使用 ShowDialog() 打开您的登录表单;
          4. 如果登录成功,则显示您的主窗体。如果没有,请关闭您的主表单/应用程序。

          【讨论】:

          • 对不起,我有很多表格,我需要通过关闭另一个来显示一个,同时我需要处理 application.exit 否则 EXE 将在任务进程管理器中运行。感谢您的帮助,但无法使用此功能。
          【解决方案7】:

          为什么不直接在 form_closed 事件中停止调用 application.exit 呢?

          我不确定你是否真的需要它,如果你需要它,那么你可以从屏幕上删除 x 图标并给它们一个关闭按钮。

          或者,在事件 args 中有一个 CloseReason,它会告诉您是用户关闭了表单或代码还是其他东西。

          【讨论】:

          • 不,我不能通过禁用 X 按钮来使用退出按钮,这是一个非常棘手的问题。感谢您的评论,但它还没有解决我的问题。
          • 和 CloseReason?从内存中,当用户关闭表单时,它是 CloseReason.UserClosing,而当它以编程方式关闭时,它是其他东西。
          【解决方案8】:

          我不太确定我是否理解这一点,如果你想遍历特定的表单顺序,也许你可以这样做:(伪代码)

          Dim formsList as New List(Of form)
          formsList.add(Form1)
          formsList.add(Form2)
          formsList.add(Form3)
          ' etc etc etc '
          
          For Each f as Form in formsList
          
              f.ShowDialog()
              ' you could have a condition here which breaks the for loop perhaps '
          
          Next
          
          Me.close ' close the app '
          

          您可以在 For 循环中添加一个条件来中断 for 循环以提前结束...

          注意:很抱歉 vb.net 代码...不过应该很容易理解

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-14
            • 1970-01-01
            • 2010-12-20
            • 1970-01-01
            • 2013-08-31
            • 2022-01-09
            • 1970-01-01
            • 2017-02-01
            相关资源
            最近更新 更多