注销主表单并显示登录表单

本文关键字:表单 登录 显示 注销 | 更新日期: 2023-09-27 18:09:58

我知道这个问题可能听起来很愚蠢,但可悲的情况下,我已经在网上搜索得到解决方案,但仍然不能得到正确的。我现在的问题是=注销按钮,以便退出主表单,然后再次显示登录表单。下面的代码在我点击注销按钮后不会显示登录表单,它会直接退出整个应用程序。

void logoutbtn_Click(object sender, EventArgs e)
    {
        CloseSockets(); 
        this.Close();
        serverlogin login = new serverlogin();
        login.Show();   
    }

因此,我尝试替换this.Hide()而不是this.Close();。但是,更愚蠢的事情发生了。是的,登录页面显示后,我点击注销按钮,但当我点击取消按钮在我的登录表单,它没有退出整个应用程序,它应该退出整个应用程序。我猜是因为主要形式只是隐藏,还没有接近??另外,当我尝试再次登录时,登录按钮也不起作用,无法登录主页。

我为我的解释道歉,如果我的解释不清楚,请告诉我。请帮帮我。非常感谢。

注销主表单并显示登录表单

你需要在表单中定义2个事件,当按钮点击时触发,并在主表单中处理:

MainForm.cs

void logoutbtn_Click(object sender, EventArgs e)
{
    CloseSockets();
    this.Hide();
    serverlogin login = new serverlogin();
    login.Login += new EventHandler(serverlogin_Login);
    login.Cancel += new EventHandler(serverlogin_Cancel);
    login.Show();
}
private void serverlogin_Login(object sender, EventArgs args)
{
    this.Show();
    // do login
}
private void serverlogin_Cancel(object sender, EventArgs args)
{
    Application.Exit();
    // do exit
}

LoginForm.cs

public event EventHandler Login;
public event EventHandler Cancel;
private void OnLogin()
{
    if (Login != null)
        Login(this, EventArgs.Empty);
}
private void OnCancel()
{
    if (Login != null)
        Login(this, EventArgs.Empty);
}
private void btnLogin_Click(object sender, EventArgs e)
{
    this.OnLogin();
}
private void btnCancel_Click(object sender, EventArgs e)
{
    this.OnCancel();
}

您可能只想启动应用程序的新实例,然后在选择"logout"时退出旧实例。这将清除所有仍在使用的资源,并使数据从一个用户会话泄漏到下一个用户会话变得更加困难。

缺点,当然,它会比较慢,但有ngen.exe来减少重新启动应用程序的成本。

我复习了第一个答案,发现有问题。在代码中,他在创建新线程后关闭表单。我试过了,但它总是关闭我的表单。所以我把this.Close();换成t.Start();,它工作了。下面是对代码的解释。

你创建一个新的线程,然后你关闭你所在的窗体(例如菜单),最后你启动你的新线程。您将在其中创建一个运行新表单的新方法。我逐行注释了。

private void btnLogout_Click(object sender, EventArgs e)
{
    System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(OpenLoginForm)); //you create a new thread
    this.Close(); //you close your current form (for example a menu)
    t.Start();  //you start the thread
}
public static void OpenLoginForm()
{
    Application.Run(new LoginForm()); //run your new form
}
private void btnLogout_Click(object sender, EventArgs e)
    {
        System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(OpenLoginForm));
        t.Start();
        this.Close();   
    }
    public static void OpenLoginForm()
    {
        Application.Run(new LoginForm());
    }