【问题标题】:C# Threading: How to open main form after thread is closedC#线程:线程关闭后如何打开主窗体
【发布时间】:2012-01-24 20:01:33
【问题描述】:

如果这个问题与其他问题重复,请原谅我,我可能不知道如何正确说出我的问题,这就是为什么我找不到合适的答案。

我有一个带有多个表单的 winforms C# 应用程序。我的主要表单是一个登录表单,在它之前是一个首先加载的启动屏幕。我的问题是,每当我单击注销时,我都希望它返回登录屏幕。但是,启动屏幕加载并且不再打开登录表单。

我怀疑这是因为我启动了一个新线程才能关闭主窗体并打开下一个窗体?我在某处读到它必须这样做,因为仅使用 main.close() 和 form1.show() 时会发生错误。帮忙?

闪屏代码

public SplashScreen()
{
   InitializeComponent();
}

private void timer1_Tick(object sender, EventArgs e)
{
    progressBar1.Increment(1);
    if (progressBar1.Value == 100) timer1.Stop();
}

登录开始

public LOGIN()
{
   Thread t = new Thread(new ThreadStart(SplashScreen));
   t.Start();
   Thread.Sleep(5000);
   InitializeComponent();
   t.Abort();
}

public void SplashScreen()
{
   Application.Run(new SplashScreen());
}

登录退出(重定向到用户主页)

public static void OpenHomeAdmin() // new thread to open home ADMIN
{
    Application.Run(new Home_Admin());
}

if (usertype == "UT1") //admin rights
{
     //GET LOGGED USER
      Home_Admin homeAdmin = new Home_Admin();
      homeAdmin.SetUsername(username);

      this.Close();
      System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(OpenHomeAdmin));
      t.Start();
 }

【问题讨论】:

  • Application.Run(Form) 用于在当前线程上运行新应用程序。这是你的意图吗?您只是想显示新表单吗?
  • @mhornfeck 我只想关闭我的主表单,然后打开另一个表单。
  • 能把处理点击事件的代码贴出来注销吗?

标签: c# winforms


【解决方案1】:

我也有同样的需求,我写了下面的代码!

Program.cs 下 Main()

Application.Run(new Splash()); //Splash Screen if u wanna run BEFORE Login Form

/*Showing Login Form Before Entering the Main Form [Authentication]*/

login f1 = new login();
DialogResult dr = f1.ShowDialog();
if (dr == DialogResult.OK)
{             
  Application.Run(new Splash()); //Splash Screen if u wanna run AFTER Login Form
  Application.Run(new Home_Admin());
}
else
{
  Application.Exit();
} 

登录表单 - 满足认证后,编写如下代码

this.DialogResult = DialogResult.OK;
this.Close();

这将关闭您的登录表单并返回 Program.cs,然后将加载您的 Home_Admin。

Home_Admin中制作一个Logout按钮并在click_event中编写如下代码

this.Close();
login f1=new login();
f1.Show();

现在您将被注销并返回登录屏幕。

注意:不要使用 this.Close();在主窗体中,这可能会退出您的应用程序。你可以使用 this.Hide();在这样的追逐中。

希望这对你有所帮助。 试试这个并返回您的评论。

【讨论】:

    【解决方案2】:

    我认为您无需创建新线程即可打开/关闭表单。请尝试以下代码:

    if (usertype == "UT1") //admin rights
    {
         //GET LOGGED USER
          Home_Admin homeAdmin = new Home_Admin();
          homeAdmin.SetUsername(username);
    
          this.Hide();
          homeAdmin.Show();
     }
    

    请注意,Form.Close() 将释放 Form 对象,这意味着在该对象中创建的所有资源也将关闭。 Read more hereForm.Hide() 也可以将表单从用户的视图中隐藏起来。

    【讨论】:

    • 如果我这样做,我的启动屏幕将不再显示。我的启动画面的实现也不正确吗?我使用了线程:|
    • 我认为这不是一个好方法。 Use Thread.Abort() only as a last resort。我会在 SplashScreen 表单中使用 Timer,它会在 5 秒后关闭表单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多