2012-04-12 138 views
0

我有一个启动了登录屏幕的Winforms应用程序。如果用户的登录凭证都不错,这种方法被称为:关闭一个窗体并打开另一个窗体

public void success() 
{ 
    mainForm index = new mainForm(); 
    index.Show(); 
    this.Close(); 
} 

我认为这会打开mainForm和关闭登录表单,但是当我运行它,它会关闭整个应用程序。这是为什么?一般来说,我对C#和OOP都很陌生,所以任何提示都会被赞赏!

我试图做这样的事情: Closing a form and then call another one

但我仍然得到了同样的结果。

谢谢:)

回答

2

不喜欢它:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
    using (Login login = new Login()) 
    { 
    login.StartPosition = FormStartPosition.CenterScreen; 
    if (login.ShowDialog() == DialogResult.OK) 
    {  
     Application.Run(new Form1(login.strUserName)); //passing the userName to the constructor of form1 (see bellow) 
    } 
    } 
    } 
} 

//form1: 
public partial class Form1 : Form 
{ 
    string userName; 
    public Form1(string _strUser) 
    { 
    InitializeComponent(); 
    userName = _userName; //a local variable of a form1 class has hold user`s name (userName - which u can call it from within the form1 class! 
    } 
} 
+0

该代码显示了如何从登录表单向主窗体传递变量(的用户名)。 – 2012-04-12 15:38:19

+0

谢谢你的代码,我正在努力实现它!一个问题,应该'userName = _userName'实际上是'userName = _strUser'?否则,我应该从哪里获取'_userName'? – 2012-04-12 15:51:43

+0

它可以是任何变量。这是我编造的一个变量。 – 2012-04-13 05:51:26

1

正如在其他问题中详细说明,你无法关闭应用程序的主窗口(即传递到Application.Run()窗口)。

要解决此问题,请将mainForm的实例传递给Application.Run(),并让mainForm在打开时显示登录对话框。

1

这里的答案解释了一些解决方案,但要澄清问题,请参阅MSDN上的Application.Run Method (Form)。它指出:

此方法将事件处理程序添加到Closed事件的mainForm参数。事件处理程序调用ExitThread来清理应用程序。

因此,因为您是从登录框开始,只要它关闭,就会触发ExitThread并关闭应用程序。正如我所说,这里的其他答案说明了几种避免此问题的方法,例如直接在Main()中创建登录框或启动主窗体并让其管理显示登录框。

0

要回答你的问题: 它可以是任何变量。这是我编造的一个变量。 它来自哪里:它实际上来自登录表单。有一个公共财产,有一个私人二传手,只能在登录表单中设置。正如你从我的代码中可以看到的,我明白了:

Application.Run(new Form1(login.strUserName)); 

login是登录表单的参考。所以我只将“transfter”strUserName从登录表单变为Program(所有开始的地方)和Form1,因此我可以在那里显示它。 为什么我必须转移它,为什么我不能简单地从Form1访问它? 这是因为当代码来到Form1时,登录表单已经处理完毕,并且来自Login的所有成员都设置为null(不可访问)。你可以看到什么时候我创建了Login类,我在使用block时做了它,所以当代码离开它时,类也放弃它。

BTW,登录形式如下:

class Login 
{ 
    public string strUserName { get; private set; } 
} 

希望它可以帮助理解。 bye

相关问题