显示之前隐藏的相同形式

时间:2012-11-05 05:26:26

标签: c# winforms

在我的项目中,有frmLoginfrmMain两种形式。从frmLogin成功登录后,我通过执行以下操作向用户显示frmMain表单:

frmLogin表单button_click事件:

frmMain main = new frmMain();
main.Show();
this.Hide();

frmMain用户注销时,我想显示相同的frmLogin表单(不是实例)。怎么做?

我尝试了这段代码:(创建另一个我不想要的frmLogin实例

frmMain表单button_click事件:

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

我也尝试使用internal说明符,但没有用。

编辑:作为受训者,我不得使用Static关键字并更改program.cs。如果上述方法需要限制性方法(我已经提到过),那么请建议我采用另一种方法。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

您需要做的就是将登录页面指定为owner of nextform to be opened

在您要打开nextForm的函数的登录页面调用中

void openNextForm()
{
    Form f2 = new YourForm();    
    f2.owner=this;
    f2.Show();
    this.Hide();
}

在你的nextForm(例如mainForm)中,按下按钮点击

void ButtonLogOut_Click(object sender, EventArgs e)
{
     this.Owner.Show();
     this.Hide();
     this.Dispose();
}

答案 2 :(得分:1)

我认为处理多个表单时最干净的方法是在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()

答案 3 :(得分:1)

我不明白为什么你不使用ShowDialog()方法?

 frmMain main = new frmMain();
 this.Hide();
 main.ShowDialog();
 this.Show();

登录表单将被隐藏,在主表单关闭后,登录表单的执行将继续,并将自动显示...