1

「検索」というボタンがあるフォームがあります。クリックすると、アイテムを検索するための別のフォームが開きます。ユーザーがこの 2 番目のフォームの X をクリックして閉じる場合、実際には閉じたくありません。(by によってsecondForm.visible = false) 非表示にしたいだけです。

必要なのはメソッドをオーバーライドすることだけであることがわかりましOnFormClosing()た。フォームクラスで実行しましたが、まったく実行されません。次に「検索」ボタンがクリックされたときに(実行new SecondForm()しようとするのではなく)、削除されたオブジェクト( )または何かsecondForm.visible = trueで作業できないという例外が発生するため、実行されないことがわかっていますsecondFormそのように。したがって、2 番目のフォームは表示されていないのではなく、閉じられています。

この時点で、私が必要としているのは、何らかの方法で (これは明らかにわかりません)、この新しいオーバーライド メソッドをボタン X に割り当てることだと考え始めています。

編集:

これは、クラスから 2 番目のオーバーライドされたメソッドです。

protected override void OnFormClosing(FormClosingEventArgs e)
    {
        base.OnFormClosing(e);

        if (e.CloseReason == CloseReason.WindowsShutDown) return;

        this.Visible = false;
    }

これは、「検索」ボタンがクリックされたときに行うことです。

private void btnSearch_Click(object sender, EventArgs e)
    {
        if (subFormCreated)
            subFormSearch.Visible = true;
        else
            initializeSubFormSearch();
    }

    private void initializeSubFormSearch() 
    {
        subFormSearch = new SubForm(listaPersonas, actualMostrado);
        subFormSearch.Show();
        subFormCreated = true;
    }

最後に、私が得る例外はObjectDisposedException. 正確なメッセージは次のようなものです(正しく翻訳しているかどうかはわかりません)ObjectDisposedException was unhandled. Cannot get access to the deleted object. Name of the object: SubForm.

4

2 に答える 2

1

ここで何も上書きする必要はありません。FormClosingイベントを処理して設定するだけe.Cancel = Trueです。さらに、同じハンドラーでフォームを非表示にします。最初のフォームで、2 番目のフォームのクラス レベル オブジェクトを作成し、ShowDialog()[検索] ボタンのクリック時にそれを呼び出します。最後に、[ OK ] ボタンと[キャンセル]ボタンのDailogResultプロパティが適切に設定されていることを確認してください。おおよそ次のようになります。

class Form1
{
     private Form2 dlg;

    private void btnSearch_Click(object sender, EventArgs e)
    {
        if(dlg==null) dlg = new Form2();
        dlg.ShowDialog(this);
    }
}

class Form2
{
    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        e.Cancel = true;
        this.Hide();
    }
}
于 2014-10-26T10:48:34.947 に答える