1

ComboBox から入力を選択するように要求し、別の ComboBox から 2 番目の入力を選択するように要求するアプリケーションを作成しています (最初の入力に基づいて、最初の入力ごとに異なる可能性があります)。両方の入力が設定されている場合の場合、ユーザーはこれらの入力を 2 番目のフォームに渡すボタンを押し、 を使用してフォームform2.show()を開きます (入力はプロパティを介して渡されます)。私が望むのは、この新しいフォームを閉じて(この機能は完了しています)、新しい入力を選択して、今度は新しい入力を使用して2番目のフォームを再度開くことができるようにすることです。入力は、新しいフォームで呼び出される情報を変更します。現在、入力を変更した後にボタンを押して新しいフォームを開くと、プログラムがクラッシュします。

助言がありますか?!

ありがとう!

アップデート

私が得ているエラーは次のとおりです: System.ObjectDisposedException: 破棄されたオブジェクトにアクセスできません。オブジェクト名: 'Form2'。

そしてコード。

メインフォームから:

private void button1_Click(object sender, EventArgs e)
    {
        report_form.TypeSelected = type_selected;
        report_form.LoadSelected = load_selected;
        report_form.Show();
    }

子フォームから:

public string TypeSelected { get; set; }
public string LoadSelected { get; set; }
private void Form2_Load(object sender, EventArgs e)
    {
        this.Text = "Report for " + TypeSelected + " load " + LoadSelected;
        label1.Text = "Type: " + TypeSelected;
        label2.Text = "Load: " + LoadSelected;

        dataGridView1.DataSource = bindingSource1;
        GetData();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }
4

1 に答える 1

1

コードから、おそらく子フォームを複数回表示しているようです。close を呼び出すと、フォームは DISposed され、再インスタンス化せずに再度 show を呼び出すと、その例外が発生します。子フォームを閉じるのではなく非表示にするか、閉じる場合は、表示するたびに再作成する必要があります。(閉じるのではなく非表示にします。)

また、子フォームにShowDialogを使用することも検討できます。これは、ユーザーが親フォームを操作したくない、または操作する必要がない場合にデータを収集するための推奨される方法です...これにより、子フォームとのやり取りが大幅に簡素化されます。

ハイホース: アプリケーションをMVC (モデル、ビュー コントローラー) にリファクタリングする必要があります。コントローラー クラスは、どのフォームをロードしていつ開くかを決定し、フォーム間でモデル (データ) を渡すこともできます。この種の関心の分離は、アプリを整理して問題を回避するのに非常に役立ちます。または MVP も: ( Model View Presenter )

于 2013-03-21T20:24:49.483 に答える