【问题标题】:Closing one form and opening another关闭一个表格并打开另一个表格
【发布时间】:2012-04-24 23:55:20
【问题描述】:

我有一个以登录屏幕启动的 Winforms 应用程序。如果用户的登录凭据良好,则调用此方法:

public void success()
{
    mainForm index = new mainForm();
    index.Show();
    this.Close();
}

我以为这会打开mainForm 并关闭登录表单,但是当我运行它时,它会关闭整个应用程序。这是为什么?总的来说,我对 C# 和 OOP 还很陌生,因此欢迎提供任何提示!

我尝试做这样的事情: Closing a form and then call another one

但我仍然得到相同的结果。

谢谢:)

【问题讨论】:

    标签: c# winforms oop


    【解决方案1】:

    这样做:

    static class Program
     {
      /// <summary>
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
      static void Main()
      {   
        using (Login login = new Login())
        {
         login.StartPosition = FormStartPosition.CenterScreen;
         if (login.ShowDialog() == DialogResult.OK)
         {      
          Application.Run(new Form1(login.strUserName)); //passing the userName to the constructor of form1 (see bellow)
         }
       }
      }
     }
    
    //form1:
     public partial class Form1 : Form
     {  
      string userName; 
      public Form1(string _strUser)
      {   
       InitializeComponent();
       userName = _userName; //a local variable of a form1 class has hold user`s name (userName - which u can call it from within the form1 class!
      }
     }
    

    【讨论】:

    • 代码展示了如何将一个变量(用户名)从登录表单传递到主表单。
    • 感谢您的代码,我正在努力实现它!一个问题,userName = _userName 应该是userName = _strUser 吗?否则,我应该从哪里获得_userName
    • 它可以是任何变量。这是我编造的变量。
    【解决方案2】:

    如另一个问题中所述,您无法关闭应用程序的主窗口(即传递给 Application.Run() 的窗口)。

    要解决这个问题,请将mainForm 的实例传递给Application.Run(),并让mainForm 在打开时显示登录对话框。

    【讨论】:

      【解决方案3】:

      您可能希望在 Program.cs 中移动您的登录表单,而不是将其设置为启动表单。在此处查看更多信息:How can I close a login form and show the main form without my application closing?

      另一种解决方案是在用户成功登录后隐藏登录表单并打开新的登录表单,并在主窗口关闭时使用事件关闭登录表单(将被隐藏)。

      【讨论】:

        【解决方案4】:

        这里的答案解释了一些解决方案,但要澄清问题,请参阅 MSDN 上的Application.Run Method (Form)。它指出:

        此方法将事件处理程序添加到 Closed 事件的 mainForm 参数。事件处理程序调用 ExitThread 来清理应用程序。

        所以,因为您是从登录框开始的,所以一旦它关闭,它就会触发 ExitThread 并关闭应用程序。正如我所说,这里的其他答案说明了避免此问题的几种方法,例如直接在 Main() 中创建登录框或启动主窗体并让它管理显示登录框。

        【讨论】:

          【解决方案5】:

          回答您的问题: 它可以是任何变量。这是我编造的一个变量。 它来自哪里:它实际上来自登录表单。有一个公共属性有一个私有设置器,并且只能在登录表单中设置。从我的代码中可以看出,我明白了:

          Application.Run(new Form1(login.strUserName)); 
          

          login 是登录表单的引用。因此,我只将 strUserName 变量从登录表单“转移”到 Program(一切开始的地方)和 Form1,这样我就可以在那里显示它。 为什么我必须转移它,为什么我不能简单地从 Form1 访问它? 这是因为当代码来到 Form1 时,Login 表单已经被释放,并且所有来自 Login 的成员都设置为 null(不可访问)。你可以看到当我实例化 Login 类时,我是在 using 块中完成的,所以当代码离开它时,类也将它处理掉。

          顺便说一句,登录表单如下所示:

          class Login
          {
             public string strUserName { get; private set; }
          }
          

          希望它有助于理解。 再见

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-10-30
            • 1970-01-01
            • 2016-06-03
            • 1970-01-01
            • 2013-06-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多