0

ユーザーのログインを確認するフォームを作成しようとしています。そのフォームを最初に表示してから、ユーザーのログインが成功すると、メインフォームが表示されるはずです。

これは私が試したものです(2番目の形式で):

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

        

    }

問題は、メイン フォームが常に最初に表示されることです。

次のようになります。

*2番目のフォームがポップアップし、ユーザーが認証されるとメインフォームがポップアップします

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 に答える