2012-11-05 38 views
1

在我的项目中,有两种形式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。如果上述方法需要限制方法(我已提到),那么请给我一个替代方法。

+0

试试这个。 http://stackoverflow.com/questions/3005732/showing-a-hidden-form – Sandeep

回答

3

所有您需要做的就是分配登录页面owner of nextform to be opened

在登录页面中调用下面要打开nextForm

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

在你nextForm(如MainForm的)函数编写以下aginst您的按钮点击

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

不错,这是工作:)谢谢 –

+0

但问题是为什么当你可以简单地使用'ShowDialog()'方法时,你会写很多额外的代码?没有意义。 'ShowDialog()'甚至允许你在函数调用中设置父类,而不需要编写额外的代码。 –

+0

@AbijeetPatro我问了一个不值得的问题(我在看到你的答案后才意识到),但为了让它值得,我给了它一些限制。 –

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

谢谢你的回应,我想你错过了一些与'LoginForm'相关的东西,VS显示红色的涂鸦。 –

+0

好吧,我明白让我检查 –

+0

nope不工作..仍然显示红色的涂鸦 –

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

+0

谢谢你的回应,这是好的,但我不能使用它。我应该在之前提到过,请查看我编辑的问题。 –

+0

你应该说服他们让你,因为在表单内部创建表单然后传递引用会变得非常混乱和容易出错,毕竟他们是否会雇佣你编写好的或者哈希的代码? ;) –

1

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

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

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

+0

是的,这是工作,良好的逻辑,但如果我想使用show(),而不是showDialog()。只是好奇而已。 –