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

时间:2011-09-26 17:11:38

标签: c# winforms login logout

我知道这个问题可能听起来很愚蠢,但令人遗憾的是,我已经在线搜索以获得解决方案,但仍然无法使其正确无误。我现在的问题是=退出按钮,以便退出主窗体,然后再次显示登录表单。 点击退出按钮后,下面的代码不会显示登录表单,它会立即退出整个应用程序。

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

因此,我尝试替换this.Hide()而不是this.Close();。但是,有些事情甚至是愚蠢的。是的,点击退出按钮后显示登录页面,但是当我点击登录表单上的取消按钮时,它没有退出整个应用程序,它假设退出整个应用程序。我猜是因为主要形式只是隐藏而尚未关闭???另外,当我再次尝试登录时,登录按钮也无法正常登录主页。

我为我的解释道歉,请告诉我是否非常不清楚。 请帮助我。非常感谢你。

4 个答案:

答案 0 :(得分:0)

您需要在表单中定义2个事件,该事件将在butttons点击并在主窗体中处理它时触发:

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();
}

答案 1 :(得分:0)

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

当然,缺点是速度较慢,但​​ngen.exe可以降低重启应用的成本。

答案 2 :(得分:0)

我查看了第一个答案,发现有问题。在代码中,他在创建新线程后关闭了表单。我测试了它,但是它总是关闭我的表单。因此,我用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
}

答案 3 :(得分:-2)

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());
    }