我知道这个问题可能听起来很愚蠢,但是悲伤的情况下,我已经在网上搜索以获得解决方案,但仍然无法使其正确。我现在的问题是=退出按钮,以便退出主窗体,然后再次显示登录表单。单击注销按钮后,下面的代码不会显示登录表单,它会立即退出整个应用程序。
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();
}
您可能只想启动应用程序的新实例,然后在选择“注销”时退出旧实例。这样可以清除所有仍在使用的资源,并使数据从一个用户会话泄漏到下一个用户会话变得更加困难。
当然,缺点是它会更慢,但是有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());
}