0

フォームのインスタンスをある意味で開くにはどうすればよいModalですか?

試しthis.ShowDialog()ましたが、フォームがモーダルに表示されません(他のフォームにアクセスできます)。これは、それ自体が表示される場合はそれ自体の親フォームであるためだと思いますが、よくわかりません。

私の問題:

私は2つのフォームで作られたアプリケーションを持っています:

  1. MainForm
  2. LoginForm

MainFormのインスタンスを作成し、開いLoginFormてユーザーに認証を依頼します。LoginFormユーザーを定期的にチェックしてログインするためのタイマーがあります-このタイマーをLoginFormモーダルに開きたいです。これはタイマーを入れることで達成できることは知っていますが、フォームをそれ自体のインスタンスにMainFormする方法を知りたいです。ShowDialog()

前もって感謝します。

4

3 に答える 3

2

ShowDialog後に電話するようにしてくださいInitializeComponent

public newForm()
{
    InitializeComponent();
    this.ShowDialog();
}

私のテスト

私はという名前の新しいクラスを作りましたForm2

public partial class Form2 : Form
{
    public Form2()
    {
        //this may not call in constractor 
        //InitializeComponent();
    }

    public void ShowModalForm()
    {
        InitializeComponent();
        ShowDialog();
    }
}

親なしでメインで起動すると、モーダルで起動します。

static class Program
{
    [STAThread]
    static void Main()
    {
        new Form2().ShowModalForm();
        //Application.Run(new Form1());
    }
}
于 2012-07-12T10:28:01.977 に答える
1

トップレベルウィンドウ(親がない)の場合、フォームはモーダルになりません。一方、フォームに親として他のフォームがある場合は、でモーダルに開きます(親をブロックします).ShowDialog()

于 2012-07-12T10:29:24.723 に答える
0

ここにあなたのためのオプションがあります-LoginExpiredあなたのでイベントを定義してくださいLoginForm。タイマーティックイベントハンドラーでこのイベントを発生させます。

public partial class LoginForm : Form
{
    public event EventHandler LoginExpired;

    public LoginForm()
    {
        InitializeComponent();
        timer.Start();
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        OnLoginExpired();
    }

    protected virtual void OnLoginExpired()
    {
        if (Visible)
            return; // if this form visible, then user didn't authenticate yet

        if (LoginExpired != null)
            LoginExpired(this, EventArgs.Empty);
    }        
}

Main次に、メソッドでこのイベントをサブスクライブします。

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    using (LoginForm loginForm = new LoginForm())
    {
        if (loginForm.ShowDialog() != DialogResult.OK)
            return;

        loginForm.LoginExpired += new EventHandler(loginForm_LoginExpired);
        Application.Run(new MainForm());
    }
}

static void loginForm_LoginExpired(object sender, EventArgs e)
{
    LoginForm loginForm = (LoginForm)sender;
    if (loginForm.ShowDialog() != DialogResult.OK)
        throw new NotAuthenticatedException();
} 
于 2012-07-12T11:41:32.937 に答える