仅当用户从第二个表单成功登录时,如何才能显示主表单?

How do I make the main form show only if the user login is successful from a second form?

我正在尝试制作一个验证用户登录的表单。我希望先显示该表单,如果用户登录成功,则应显示主表单。

这是我试过的(第二种形式):

 private void button1_Click(object sender, EventArgs e)
    {
        string funame = "thename";
        string dep = "thedep";
        string unm = "theusername";
        string ups = "thepassword";

        User cs = new User(funame, dep, unm, ups);

        if (cs.validateLogin(unm, ups));
        {
            MessageBox.Show("Welcome " + funame + " of " + dep);

            frmPurchaseDiscountedItem fpd = new frmPurchaseDiscountedItem();
            fpd.Show();
        }

        

    }

问题是主窗体总是先弹出。

应该是这样的:

*然后弹出第二个表单,如果用户通过验证,则弹出主表单

这是一个解决方法。

您不需要在 Program.cs 中更改“开始表格”。可以把开头的mainwindow打开,隐藏起来。然后创建一个登录实例并显示它。

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();

        Login login = new Login(this);
        // hide MainForm
        this.Hide();
        // show Login
        login.ShowDialog();
    }
}

如果点击 Login form 中的登录按钮,显示 MainForm 并关闭 Login form

public partial class Login : Form
{
    private MainForm mainform = null;

    public Login(MainForm main)
    {
        InitializeComponent();
        // get MainForm instance
        this.mainform = main;
    }

    // if success
    bool success = true;

    private void btnLogin_Click(object sender, EventArgs e)
    {
        if(success) // check login here
        {
            // show main form
            mainform.Visible = true;
            // close login form
            this.Close();
        }
    }
}

此外,如果点击Login form右上角的X button,也会显示隐藏的MainForm(如果用户不想登录, 关闭应用程序)。我们可以通过覆盖 WndProc.

来避免它
protected override void WndProc(ref Message msg)
{
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_CLOSE = 0xF060;
    if (msg.Msg == WM_SYSCOMMAND && ((int)msg.WParam == SC_CLOSE))
    {
        // click the 'X' button to close the application
        Application.Exit();
        return;
    }
    base.WndProc(ref msg);
}