-3

以下のコード実行に関する知識が必要です。Form1 には、別のフォーム Form2 を呼び出すボタンがあります。

private void button1_Click(object sender, EventArgs e)
{
Form2 obj = new Form2();
obj.Show();
}

show メソッドを使用したので、実行は続行され、イベント コールから抜け出します。Form2 FormClosing & FormClosed イベントでメッセージボックスを表示していますが、いずれもヒットしませんでした。

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
MessageBox.Show("Form2 closed");
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
MessageBox.Show("Form2 closing");
}

この理由は何でも構いません。好奇心から私はこの実験を行い、これについての知識を得たい.

4

4 に答える 4

1

両方のイベントがトリガーされるはずですが、おそらくイベント ハンドラーが正しくアタッチされていません。次のコードを Form_Loadイベント内に記述してForm2、もう一度試してください。

this.Form1_FormClosed += Form2_FormClosed;
this.Form1_FormClosing += Form2_FormClosing;
于 2014-02-26T07:03:51.280 に答える
1

はグローバルとして宣言されていないためobj、イベント ハンドラーが終了するとスコープ外になります。インスタンスをグローバルにします。つまり、メソッド内ではなくShow、イベント ハンドラ内でのみメソッドを呼び出します。これでうまくいくはずです。

于 2014-02-26T07:04:05.603 に答える
1

そのため、イベントをサブスクライブしていないようです。

コードは次のようになります。

フォーム1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 obj = new Form2();
        obj.Show();
    }
}

フォーム2

partial class Form2
{
    private System.ComponentModel.IContainer components = null;

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    private void InitializeComponent()
    {
        this.SuspendLayout();
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(284, 262);
        this.Name = "Form2";
        this.Text = "Form2";
        this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing);
        this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form2_FormClosed);
        this.ResumeLayout(false);

    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        MessageBox.Show("Form2 closed.");
    }

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        MessageBox.Show("Form2 closing.");
    }
}

すべてを Form1 内に保持することもできます (サブスクリプションに関する限り)。

フォーム1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 obj = new Form2();
        obj.Show();
        obj.FormClosing += new System.Windows.Forms.FormClosingEventHandler(Form2_FormClosing);
        obj.FormClosed += new System.Windows.Forms.FormClosedEventHandler(Form2_FormClosed);
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        MessageBox.Show("Form2 closed.");
    }

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        MessageBox.Show("Form2 closing.");
    }
}

私が提供した 2 つのバージョンのコードはテスト済みで、問題なく動作します。しかし、あなたは私たちに 3 つの方法しか示しておらず、あなたが何をしていて問題を引き起こしているのかわかりません. デバッグ方法を学ぶことをお勧めします。たとえば、認識された「適切な」条件下でも、実行されないコードの前にブレーキ ポイントを設定します。その後、コードをステップ実行して、エラーが発生した場所を確認できます。この方法でどれだけ多くのバグをキャッチできるかに驚かれることでしょう。

于 2014-02-26T07:08:28.467 に答える
1

実行は終了しますが、それを示したオブジェクトはそのスコープから破棄されます。

ああ、いいえ、フォームは死ぬことはありません。それは生き続け、アプリケーションのメイン フォームのイベント ループを使用しますbutton1

フォームが表示され、瞬く間に閉じます

これは、別の理由による可能性があります。フォームを隠しているか、Form2Loadイベントに他のコードがある可能性があります。フォームが非表示になり、閉じられていない可能性があります。

于 2014-02-26T07:25:44.777 に答える