C# windows窗体打开后立即关闭

C# windows窗体打开后立即关闭,c#,winforms,C#,Winforms,当我从登录屏幕打开一个新表单时,它会让用户登录,显示表单,然后立即消失 以下是我的相关部分代码: 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 = n

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

以下是我的相关部分代码:

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();
    }
 static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MDI_Form());
    }
my program.cs文件包含以下代码:

        private void MDI_Form_Load(object sender, EventArgs e)
    {
        Form1 loginscrn = new Form1();
        loginscrn.Show();
    }
 static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MDI_Form());
    }
这会起作用吗?

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

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

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

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
或 通过创建另一个隐藏表单并使其成为启动表单,使您的登录表单不是启动表单

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
这是大多数Windows窗体项目中的样板引导代码。它创建一个窗体,作为您的主窗口,并调用
应用程序。在该窗体上运行
。这导致它运行一个消息循环,允许表单以事件驱动的方式执行(等待用户输入)。当您在此主窗体上调用
Close
时,您的
应用程序.Run
方法返回,您的
main
方法运行完成,从而导致程序退出

在我看来,你想做的是显示一个窗体,比如启动屏幕或登录窗口,然后当它关闭时,你想显示另一个窗体并运行第二个窗体作为你的主窗体

为此,至少有两种方法:

  • 修改
    Main
    方法,使其创建登录表单,调用
    应用程序。对其运行
    并等待其关闭,然后通过属性(如
    DialogResult
    属性)分析结果,以了解是否成功。然后,它可以稍后创建主窗体并再次调用
    应用程序。在其上运行
在这种情况下,您的代码可能如下所示:

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,或者根据需要设置一些其他设置,以表示登录成功

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

在我看来,你想做的是显示一个窗体,比如启动屏幕或登录窗口,然后当它关闭时,你想显示另一个窗体并运行第二个窗体作为你的主窗体

为此,至少有两种方法:

  • 修改
    Main
    方法,使其创建登录表单,调用
    应用程序。对其运行
    并等待其关闭,然后通过属性(如
    DialogResult
    属性)分析结果,以了解是否成功。然后,它可以稍后创建主窗体并再次调用
    应用程序。在其上运行
在这种情况下,您的代码可能如下所示:

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
或其他必要的设置,以表示登录成功。

这是什么。Close();对于您是否在另一个表单中?您是否尝试过调试??当我打开用户或管理员屏幕时,我所在的表单(登录屏幕)必须消失,因此当我打开相关屏幕(userScreen usrscrn=new userScreen();usrscrn.Show();)时,它会关闭登录屏幕删除此项。Close()让我们知道结果,
它只是抛出一个异常,告诉我们这是什么?每当遇到异常时,始终发布完整的异常。this.Close();对于您是否在另一个表单中?您是否尝试过调试??当我打开用户或管理员屏幕时,我所在的表单(登录屏幕)必须消失,因此当我打开相关屏幕(userScreen usrscrn=new userScreen();usrscrn.Show();)时,它会关闭登录屏幕删除此项。Close()让我们知道结果,
它只是抛出一个异常,告诉我们这是什么?无论何时收到异常,始终发布完整的exception.mdi表单?这像主窗体吗?是的,将主窗体标记为MDI,它位于窗体属性中,然后将这两个窗体添加到主窗体中。如果应用程序的设计是