0

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

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

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

        

    }

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

它应该是这样的:

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

4

1 回答 1

0

这是一种解决方法。

您无需更改Program.cs. 您可以在开始时打开主窗口并将其隐藏。然后创建一个 Login 实例并显示它。

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

另外,如果您点击X button右上角的Login form,它也会显示隐藏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);
}
于 2020-11-05T01:47:49.797 回答