【问题标题】:windows forms closing immediately when openedwindows窗体打开后立即关闭
【发布时间】:2013-10-04 19:37:08
【问题描述】:

当我从登录屏幕打开一个新表单时,它会登录用户,显示表单然后立即消失???

这是我相关部分的代码:

string checkAdmin = "select * from Logins where Name = @userName and UserType ='Admin'";
string checkUser = "select * from Logins where Name = @userName and UserType ='User'";
using (var connection = new SqlConnection(@"server=.\SQLEXPRESS; database=loginsTest;Trusted_Connection=yes"))
{
   using (var checkAdminCommand = new SqlCommand(checkAdmin, connection))
   {
      //guessing at the column length here. Use actual column size instead of 20
      checkAdminCommand.Parameters.Add("@username", SqlDbType.NVarChar, 50).Value = userNameBox.Text;
      connection.Open();

      if (checkAdminCommand.ExecuteScalar() != null)
      {
         adminScreen admnscrn = new adminScreen();
         admnscrn.Show();
         this.Close();
         return;
      }

      else
      {
      }
   }

using (var connection = new SqlConnection(@"server=.\SQLEXPRESS; database=loginsTest;Trusted_Connection=yes"))
{
   using (var checkUserCommand = new SqlCommand(checkUser, connection))
   {
      //guessing at the column length here. Use actual column size instead of 20
      checkUserCommand.Parameters.Add("@username", SqlDbType.NVarChar, 50).Value = userNameBox.Text;

      connection.Open();
      if (checkUserCommand.ExecuteScalar() != null)
      {
         userScreen usrscrn = new userScreen();
         usrscrn.Show();
         this.Close();
      }

      else
      {
         MessageBox.Show("Invalid details, try again");
         passwordBox.Text = "";
      }
   }
}

所以当我打开 usrscrn 或 admnscrn 时,它会弹起然后又直接返回?我试过研究,我用过 Application.Run(userScreen());等等,它只是抛出一个异常,说明第二个消息循环?

我新建了一个画面,设置为MDI,输入如下代码:

        private void MDI_Form_Load(object sender, EventArgs e)
    {
        Form1 loginscrn = new Form1();
        loginscrn.Show();
    }

我的 program.cs 文件包含以下代码:

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

这行得通吗??

【问题讨论】:

  • 这是什么 this.Close();为了 ?你在另一个表格里吗?
  • 你试过调试吗??
  • 当我打开用户或管理屏幕时,我所在的表单(登录屏幕)必须消失,所以当我打开相关屏幕时(userScreen usrscrn = new userScreen(); usrscrn.Show() ;) 然后它关闭登录屏幕
  • 去掉 this.Close() 让我们知道结果
  • it just throws an exception saying something 那是什么东西?每当您遇到异常时,always 发布 full 异常。

标签: c# winforms


【解决方案1】:
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

这是大多数 Windows 窗体项目中的样板引导代码。它创建了一个表单,它应该充当您的主窗口,并在其上调用Application.Run。这会导致它运行一个消息循环,该循环允许表单以事件驱动的方式执行(等待用户输入)。当你在这个主窗体上调用 Close 时,你的 Application.Run 方法返回并且你的 Main 方法运行到完成,这会导致你的程序退出。

听起来你想要做的是显示一个表单,如启动屏幕或登录窗口,然后当它关闭时,你想显示另一个表单并运行 second 表单作为你的主要表格。

要做到这一点,至少有两种方法:

  • 修改Main方法,使其创建登录表单,在其上调用Application.Run并等待其关闭,然后通过DialogResult属性等属性分析结果以知道它是否是成功。然后它可以稍后创建您的主表单并再次调用Application.Run

在这种情况下,您的代码可能如下所示:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    LoginForm loginForm = new LoginForm();

    Application.Run(loginForm);

    if (loginForm.DialogResult == DialogResult.OK)
    {
        Application.Run(new MainForm());
    }
    else
    {
        // Error handling
    }
}
  • 或者,您可以修改Main 方法以运行主表​​单而不是登录表单,然后使用Form.ShowDialog 方法让主表单将登录窗口显示为对话框。您可以在主窗体尚未显示之前尝试执行此操作,或者将主窗体 Visible 属性设置为 false,以便您的登录窗口看起来实际上是主窗口。

你会这样做:

private void MainForm_Load(object sender, EventArgs e)
{
    this.Visible = false;

    using (var loginForm = new LoginForm())
    {
        if (loginForm.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
        {
            this.Visible = true;
        }
        else
        {
            // Error handling
            Close();
        }
    }
}

您只需要确保您的 LoginForm 正确设置 DialogResult = DialogResult.OK 或其他所需的值,以表明成功登录。

【讨论】:

    【解决方案2】:

    您需要 MDI 表单(多文档界面),它可以让其他表单进入其中,因此当您关闭一个表单时,它不会终止所有应用程序。

    或者 通过创建另一个隐藏表单并使其成为启动表单,使您的登录表单不是启动表单

    【讨论】:

    • mdi 格式?这像主表单吗?
    • 是的,将你的主窗体标记为MDI,它在窗体属性中,然后将这两个窗体添加到它。
    • 如果应用程序的设计不是 MDI 窗口,这是不正确的。
    • 我找不到 MDI 属性?
    • 那家伙不知道MDI表格,如果你有多个表格,最好有MDI表格
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多