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

Posted

技术标签:

【中文标题】注销主表单并显示登录表单【英文标题】:logout the main form and show the login form 【发布时间】:2011-11-25 09:32:08 【问题描述】:

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

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

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

我对我的解释表示歉意,如果不清楚,请告诉我。 请帮助我。非常感谢。

【问题讨论】:

【参考方案1】:

您需要在表单中定义 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();

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

我查看了第一个答案,发现有问题。在代码中,他在创建新线程后关闭了表单。我测试了它,但它总是关闭我的表单。所以我用t.Start(); 切换了this.Close();,它起作用了。下面是代码的解释。

您创建一个新线程,然后关闭您所在的表单(例如菜单),最后开始您的新线程。您创建了一个运行新表单的新方法。我逐行注释。

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

【讨论】:

【参考方案4】:
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());
    

【讨论】:

以上是关于注销主表单并显示登录表单的主要内容,如果未能解决你的问题,请参考以下文章

用户登录时不显示表单,但用户注销时显示

重新启动应用程序并重定向到 C# 中的特定表单

登录表单中的 CSRF _token 值刷新

spring-boot 表单登录/注销不起作用(找不到路径)

注销或返回 Xamarin 表单时如何更新 Shell 页面的内容

只有登录用户才能编辑表单