1

私のプロジェクトには、 と の 2 つのフォームがfrmLoginありfrmMainます。frmLoginからのログインに成功した後frmMain、次のようなことを行ってフォームをユーザーに表示しています。

フォームfrmLoginイベントbutton_click:

frmMain main = new frmMain();
main.Show();
this.Hide();

frmMainユーザーがログアウトするときに、(インスタンスではなく) 同じフォームを表示したいfrmLogin。これを行う方法?

私はこのコードを試しました:(私が欲しくない別のインスタンスを作成frmLoginしています)

フォームfrmMainイベントbutton_click:

if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes))
{
    this.FormClosing -= frmMain_FormClosing;
    //
    Process p = new Process();
    p.StartInfo.FileName = Application.ExecutablePath;
    p.Start();
    //
    this.Dispose();
}

指定子も使用してみinternalましたが、使用できません。

編集: 研修生として、Staticキーワードと変更を使用することは許可されていませんprogram.cs。上記のアプローチが制限された方法(私が言及した)を必要とする場合は、別のアプローチを提案してください。

4

4 に答える 4

4

frmLogin 参照を frmMain に渡します。次に、frmMain を破棄する直前に、frmLogin を表示します。

frmMain main = new frmMain();
main.LoginForm = this;
main.Show();
this.Hide();

次に、ボタンクリックイベントで:

if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes))
{
    this.FormClosing -= frmMain_FormClosing;
    LoginForm.Show();
    this.Dispose();
}
于 2012-11-05T05:34:35.543 に答える
3

あなたがしなければならないことは、ログインページを次のように割り当てることだけですowner of nextform to be opened

ログインページで、次の関数を呼び出して、nextForm を開きます

void openNextForm()
{
    Form f2 = new YourForm();    
    f2.owner=this;
    f2.Show();
    this.Hide();
}

あなたのnextForm(例:mainForm)で、あなたのボタンクリックに対して次のように書いてください

void ButtonLogOut_Click(object sender, EventArgs e)
{
     this.Owner.Show();
     this.Hide();
     this.Dispose();
}
于 2012-11-05T06:13:35.693 に答える
1

複数のフォームを扱うときの最もクリーンな方法は、それらを Program.cs で作成し、そこにそれらを管理するすべてのメソッドを保持してから、イベント ハンドラーからそれらのメソッドを呼び出すことだと思います。このような種類:

static class Program
{
    public static MainForm mainForm = new MainForm();
    public static LoginForm loginForm = new LoginForm();

    [STAThread]
    static void Main()
    {
        mainForm.Hide();
        loginForm.Hide();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(loginForm);
    }

    public static void Login()
    {
        loginForm.Hide();
        mainForm.Show();
        // probably do more here
    }

    public static void Logout()
    {
        if (MessageBox.Show("Do you really want to log out?", "Alert", MessageBoxButtons.YesNo).Equals(DialogResult.Yes)))
        {
            mainForm.Hide();
            loginForm.Show();
            // probably do more here
        } 
    }
}

次に、イベント ハンドラーで Program.Login() または Program.Logout() を呼び出すだけです。

于 2012-11-05T05:41:51.913 に答える
1

ShowDialog() メソッドを使用しない理由がわかりません。

 frmMain main = new frmMain();
 this.Hide();
 main.ShowDialog();
 this.Show();

ログイン フォームは非表示になり、メイン フォームが閉じられた後、ログイン フォームの実行は続行され、自動的に表示されます...

于 2012-11-05T06:15:01.570 に答える