C# 显示以前隐藏的相同窗体
在我的项目中,有两种形式C# 显示以前隐藏的相同窗体,c#,winforms,C#,Winforms,在我的项目中,有两种形式frmLogin和frmMain。从frmLogin成功登录后,我将通过如下操作向用户显示frmMain表单: static class Program { public static MainForm mainForm = new MainForm(); public static LoginForm loginForm = new LoginForm(); [STAThread] static void Main() {
frmLogin
和frmMain
。从frmLogin
成功登录后,我将通过如下操作向用户显示frmMain
表单:
static class Program
{
public static MainForm mainForm = new MainForm();
public static LoginForm loginForm = new LoginForm();
[STAThread]
static void Main()
{
mainForm.Hide();
loginForm.Hide();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(loginForm);
}
public static void Login()
{
loginForm.Hide();
mainForm.Show();
// probably do more here
}
public static void Logout()
{
if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes)))
{
mainForm.Hide();
loginForm.Show();
// probably do more here
}
}
}
在frmLogin
表单按钮中单击事件:
frmMain main = new frmMain();
main.Show();
this.Hide();
if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes))
{
this.FormClosing -= frmMain_FormClosing;
//
Process p = new Process();
p.StartInfo.FileName = Application.ExecutablePath;
p.Start();
//
this.Dispose();
}
在frmMain
中,当用户注销时,我希望显示相同的frmLogin
表单(而不是实例)。如何做到这一点
我尝试了以下代码:(创建了另一个frmLogin
的实例,我不想这样做)
在frmMain
表单按钮中单击事件:
frmMain main = new frmMain();
main.Show();
this.Hide();
if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes))
{
this.FormClosing -= frmMain_FormClosing;
//
Process p = new Process();
p.StartInfo.FileName = Application.ExecutablePath;
p.Start();
//
this.Dispose();
}
我也尝试过使用内部
说明符,但没有用
编辑:作为一名实习生,我不允许使用Static
关键字和修改program.cs
。如果上述方法需要限制性方法(我已经提到),请向我推荐一种替代方法。将frmLogin引用传递给frmMain。然后,在处理frmMain之前,显示frmLogin
frmMain main = new frmMain();
main.LoginForm = this;
main.Show();
this.Hide();
然后在按钮单击事件中:
if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes))
{
this.FormClosing -= frmMain_FormClosing;
LoginForm.Show();
this.Dispose();
}
将frmLogin引用传递给frmMain。然后,在处理frmMain之前,显示frmLogin
frmMain main = new frmMain();
main.LoginForm = this;
main.Show();
this.Hide();
然后在按钮单击事件中:
if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes))
{
this.FormClosing -= frmMain_FormClosing;
LoginForm.Show();
this.Dispose();
}
我认为处理多个表单时最干净的方法是在Program.cs中创建它们,并将管理它们的所有方法保留在那里,然后从事件处理程序调用这些方法。有点像这样:
static class Program
{
public static MainForm mainForm = new MainForm();
public static LoginForm loginForm = new LoginForm();
[STAThread]
static void Main()
{
mainForm.Hide();
loginForm.Hide();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(loginForm);
}
public static void Login()
{
loginForm.Hide();
mainForm.Show();
// probably do more here
}
public static void Logout()
{
if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes)))
{
mainForm.Hide();
loginForm.Show();
// probably do more here
}
}
}
然后在事件处理程序中,您可以调用Program.Login()或Program.Logout()我认为处理多个表单时最干净的方法是在Program.cs中创建它们,并将管理它们的所有方法保留在那里,然后从事件处理程序中调用这些方法。有点像这样:
static class Program
{
public static MainForm mainForm = new MainForm();
public static LoginForm loginForm = new LoginForm();
[STAThread]
static void Main()
{
mainForm.Hide();
loginForm.Hide();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(loginForm);
}
public static void Login()
{
loginForm.Hide();
mainForm.Show();
// probably do more here
}
public static void Logout()
{
if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes)))
{
mainForm.Hide();
loginForm.Show();
// probably do more here
}
}
}
然后在事件处理程序中,您只需调用Program.Login()或Program.Logout()您所要做的就是将登录页面指定为要打开的下一个表单的所有者
在您的登录页面中,调用以下函数以打开nextForm
void openNextForm()
{
Form f2 = new YourForm();
f2.owner=this;
f2.Show();
this.Hide();
}
在您的下一个表单(例如mainForm)中,单击按钮,编写以下内容
void ButtonLogOut_Click(object sender, EventArgs e)
{
this.Owner.Show();
this.Hide();
this.Dispose();
}
您只需将登录页面指定为要打开的下一个表单的所有者
在您的登录页面中,调用以下函数以打开nextForm
void openNextForm()
{
Form f2 = new YourForm();
f2.owner=this;
f2.Show();
this.Hide();
}
在您的下一个表单(例如mainForm)中,单击按钮,编写以下内容
void ButtonLogOut_Click(object sender, EventArgs e)
{
this.Owner.Show();
this.Hide();
this.Dispose();
}
我不明白为什么不使用ShowDialog()方法
登录表单将被隐藏,在主表单关闭后,登录表单将继续执行并自动显示…我不明白为什么不使用ShowDialog()方法
登录表单将被隐藏,在主表单关闭后,登录表单将继续执行,并将自动显示…感谢您的回复,我认为您缺少与
LoginForm
相关的内容,VS显示红色涂鸦。假设您的类名为MyLoginForm和MyMainForm,在MyMainForm中需要这样的定义:private MyLoginForm\u loginForm;public MyLoginForm LoginForm{get{return{u LoginForm;}set{{u LoginForm=value;}}
或类似的东西(我目前没有打开代码编辑器。+1这正在工作,但不幸的是,与@Sami answer.:)相比,代码太大了。是的,我同意。我对Sami的答案投了赞成票,因为它更简洁:-)感谢您的回复,我认为您缺少了与LoginForm
相关的内容,VS显示了红色的涂鸦。假设您的类名是MyLoginForm和MyMainForm,您需要MyMainForm中的定义如下:私有MyLoginForm\u LoginForm;public MyLoginForm LoginForm{get{return{u LoginForm;}set{{u LoginForm=value;}}
或类似的东西(我目前没有打开代码编辑器。+1这正在工作,但不幸的是,与@Sami answer.:)相比,代码太大了。是的,我同意。我对萨米的答案投了赞成票,因为它更干净:-)试试这个。试试这个。谢谢你的回复,这很好,但我不能用这个。我应该在前面提到,请检查我编辑过的问题。你应该说服他们让你这样做,因为在表单中创建表单,然后传递引用可能会变得非常混乱和容易出错,毕竟他们雇用你是为了编写好的还是不好的代码?;)谢谢你的回复,这很好,但我不能用这个。我应该在前面提到,请检查我编辑过的问题。你应该说服他们让你这样做,因为在表单中创建表单,然后传递引用可能会变得非常混乱和容易出错,毕竟他们雇用你是为了编写好的还是不好的代码?;)是的,这是可行的,逻辑很好,但是如果我想使用show()而不是showDialog()。只是好奇而已。是的,这是可行的,逻辑很好,但是如果我想用show()代替showDialog()。只是好奇而已。但问题是,当你可以简单地使用ShowDialog()
方法时,为什么还要编写这么多额外的代码呢?没有道理ShowDialog()
甚至允许您在函数调用本身中设置父级,而无需编写额外的代码。@AbijeetPatro我问了一个不值得问的问题(我后来看到您的答案后意识到了这一点),但为了让它值得,我给了它一些限制。是的@AbijeetPatro。您可能已经看到,我之前共享了此代码formf2=newyourform();显示+=(s,e)=>{f1.Hide();};f2.ShowDialog();f1.Show()
但他没有什么不同的查询,即仅在注销nextform时显示loginform,而不是在关闭时显示loginform。因此,我不得不编辑,但问题是,当您可以简单地使用ShowDialog()
方法时,为什么还要编写这么多额外的代码?没有道理ShowDialog()
甚至允许您在函数调用本身中设置父级,而无需编写额外的代码。@AbijeetPatro我问了一个不值得问的问题(我后来看到您的答案后意识到了这一点),但为了让它值得,我给了它一些限制。是的@AbijeetPatro。您可能在前面看到过,我在前面的表单f2中共享了此代码