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中共享了此代码