【问题标题】:Problems Closing a C# Windows Form关闭 C# Windows 窗体的问题
【发布时间】:2009-03-30 03:26:05
【问题描述】:

我在关闭 C# Windows 窗体应用程序时遇到问题。它目前只会给我一个没有标题或任何东西的空白表格。 我需要想办法关闭这个未知的小窗口。

我有 2 个表单页面,一个用于登录屏幕,一个用于实际应用。全部由 program.cs 文件运行。

program.cs

...
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new PROG1());
}

这只是 Visual Studio 创建的用于运行我的程序的基本主程序。

然后我们有主程序

PROG1.cs

...
public PROG1()
{
    Login LoginForm = new Login();
    DialogResult a = LoginForm.ShowDialog();

    if(LoginForm.ValidLogin == 1) {
        InitializeComponent();
    } else {
        Application.Exit(); //FAIL
    }
}

您可以看到,第一个 program.cs 文件调用了 PROG1.cs,它调用了 login.cs 的实例。如果您插入一个有效的登录,登录页面将关闭,主 PROG1 将按原样显示。但是,如果您只是单击红色 X 关闭登录表单,它会出现 Prog1 和 LoginForm.ValidLogin != 1 所以它不会初始化表单并会尝试关闭表单。这只会给我留下未初始化的表格,而不是关闭它。如果我执行 this.close() ,它会给我一个运行时错误。

有什么想法吗?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    将 InitializeComponent 回调放在原来的顶部。尝试使用未初始化的变量,包括试图告诉它们关闭自己,是个坏主意。

    配置您的 PROG1 表单的属性,以便隐藏而不是显示初始状态。 LoginForm 返回后,您的 PROG1 代码可以决定是显示自己还是关闭自己。

    【讨论】:

      【解决方案2】:

      您没有在失败时初始化表单的原因是因为 InitializeComponent() 方法的内容需要很长时间才能运行吗?看来您应该将程序简化为:

      static void Main()
      {
          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(false);
      
          LoginForm login = new LoginForm();
      
          if (login.ShowDialog() == DialogResult.OK &&
              login.ValidLogin == 1)
          Application.Run(new PROG1());
      }
      

      并从PROG1的构造函数中删除逻辑。

      【讨论】:

        【解决方案3】:

        你不应该在构造函数中做这样的事情。

        要么有一个新的输入表单,显示很少或什么都不显示,并在Load 事件或主表单上的Load 事件上显示登录表单。如果您显示模式对话框,他们将无法访问您的父表单,如果他们无法登录,您可以关闭父表单。

        【讨论】:

          【解决方案4】:

          我会推荐 Samuel 建议的最佳做法。但是,如果您想要快速操作,请尝试将登录逻辑移至 Visual Studio 生成的 Main:

          在 Program.cs 中

              [STAThread]
              static void Main()
              {
                  Application.EnableVisualStyles();
                  Application.SetCompatibleTextRenderingDefault(false);
          
                  Form2 login = new Form2();
                  if (login.ShowDialog() == DialogResult.Yes)
                  {
                      Application.Run(new Form1());
                  }
              }
          

          在 Form2.cs 中

              private void button1_Click(object sender, EventArgs e)
              {
                  this.DialogResult = DialogResult.No;
                  this.Close();
              }
          
              private void button2_Click(object sender, EventArgs e)
              {
                  this.DialogResult = DialogResult.Yes;
                  this.Close();
              }
          

          【讨论】:

            猜你喜欢
            • 2014-09-03
            • 2022-12-11
            • 1970-01-01
            • 2012-01-04
            • 1970-01-01
            • 1970-01-01
            • 2021-01-25
            • 2019-11-06
            • 2017-10-23
            相关资源
            最近更新 更多