1

我知道我可以通过在显示表单之前的事件中显示登录表单来劫持表单(Load() 事件,IIRC),但在(也许愚蠢地)试图“偷工减料”并创建一个快速&肮脏的登录屏幕时,我陷入了两难境地。

这是我对现有项目所做的事情(事后添加了登录表单):

1) Created the login form
2) Changed program.cs so that this login form is now the first form created
3) Added code to the login form that shows the "main" form if the login is successful. I then Hide the login form.

这导致应用程序永远不会关闭(通过 Shift+F5 除外),因为隐藏的主窗体仍在潜伏。因此,我在“主”表单的 FormClosing 事件中添加了一个“Close()”,认为这会导致整个应用程序关闭(IOW,隐藏登录表单)。

但是(也许恰当地),这并没有解决我的问题,而是导致“System.Windows.Forms.dll 中发生'System.StackOverflowException'类型的未处理异常”

现在我不知道我是否应该继续这种快速而肮脏的尝试(以及如何),或者减少我的损失并恢复到 show-the-login-form-in-the-Load-event 方法[学]。

更新

Alex M 的解决方案奏效了。您需要做的唯一额外的事情是登录表单中的类似内容:

private void buttonLogin_Click(object sender, EventArgs e)
{
    String userName = textBoxUserName.Text.Trim();
    String pwd = textBoxPassword.Text.Trim();
    if ((userName == "donMcLean") || (pwd == "Drove my Chevy to the levee but the levee was dry, them good ole boys were drinking whiskey & Rye"))
    {
        this.DialogResult = DialogResult.OK;
    }
    else
    {
        MessageBox.Show("Incorrect User Name and/or Password");
    }
}
4

1 回答 1

5

创建顺序并不是特别重要。您可以使用显示登录表单form.ShowDialog()。这样做会处理表单并解决您所描述的问题。

例如:

var login = new LoginForm();
var mainForm = new MainForm();

if (login.ShowDialog() != DialogResult.Ok) 
{
      return; // Exit the application
}

Application.Run(mainForm);
于 2012-06-29T20:27:03.770 回答