1

ボタンやイベントなどによってトリガーされる複数のフォームを含むプログラムに取り組んでいます。また、複数のフォームを介してオブジェクトを渡したり変更したりするのに問題があります。

たとえばform 1、 、form 2、およびがあるとしform 3ます。

フォーム 1 で定義されたリストがありますが、3 つのフォームすべてにそのリストの値を変更する機能が必要ですか?

ただ書くだけでは簡単ではないと思います:

Form1 frm1 = new Form1(); 

Form2 frm2 = new Form2();

等...

そうするためのより良い方法は何ですか?

4

7 に答える 7

2

続行するには2つの方法があると思いますが、リストによって異なります。

  • リストはグローバル変数です。この場合、静的クラスを作成し、リストをその中に入れて、すべての人がアクセスできるようにしたと思います。
  • リストはグローバルではありません。ここでは、フォームのコンストラクターをオーバーライドして、すべてのコンストラクターにリストを渡す必要があります。
于 2012-06-21T15:32:27.397 に答える
2

これを行うために静的メンバーは必要ありません。次のようなことをお勧めします。

  1. すべてのフォームからアクセスできるリストをインスタンス化します。いくつかのコントロール (リストボックス、コンボボックスなど) をそれにデータ バインドする場合は、BindingList型を調べます。

  2. フォームのコンストラクターが、バインドするデータ ソースなどとして使用するリストを受け入れるようにします。

    var list = new BindingList(...);
    var form1 = new Form1(list);
    var form2 = new Form2(list);
    
  3. フォームをすべて同時に開く必要がある場合は、 のShow代わりに メソッドを使用してモードレスで表示しますShowDialog

于 2012-06-20T20:07:56.093 に答える
1

静的リストが必要ない場合は、リストを公開してから、Application.OpenForms から開いているフォームを確認してください。

if (Application.OpenForms["Form1"] != null)
{
    ((Form1)Application.OpenForms["Form1"]).list[0] = 5;
}
于 2012-06-21T07:34:40.510 に答える
1

あなたは実際にMVCパターンが解決しようとしていることをやっています。モデル (リストなど)、ビュー (フォーム)、およびコントローラーが必要です。そうすれば、すべてのビューがコントローラーを使用してデータを共有/アクセスできるようになります

于 2012-06-20T20:22:44.867 に答える
1

シングルトン パターンを使用しますか?

http://en.wikipedia.org/wiki/Singleton_pattern

于 2012-06-20T20:05:35.073 に答える
1

Form1 から Form2 と Form3 を作成しているとします。これらのフォームでプロパティを作成し、リストを渡すことができます (おそらくコンストラクターを使用)。リストは参照型であるため、Form2 で変更すると、Form 1 でも変更されます。

于 2012-06-20T20:02:19.127 に答える
1

アクセス可能なすべてのグローバル データを保持する静的グローバル クラスを作成できます。または、最初のフォームで作成されたリストを、コンストラクターを介して各サブフォームに渡すことができます

例: (form1)

Form2 frm = new Form2(myList);

フォーム2で

public class Form2:Form
{
    List<MyObjects> _globalList = null;

    public Form2(List<MyObjects> listData)
    {
        InitializeComponent();
        _globalList = listData;
    }

}

次に Form2 内で、渡されたリストを使用して、その要素を変更/追加/削除できます。これらの更新は Form1 にも表示されます。もちろん、Form3 を開くときにも同じ方法を適用できます。

もう 1 つのソリューションでは、アプリケーションのあらゆる場所で使用されるグローバル値を格納する専用のグローバルな静的クラスを構築する必要があります。注意して使用すれば、非常に便利です。

GlobalData.cs ファイル内

public static class MyAppData
{
     public static List<MyObjects> GlobalData { get; set; }
}

Form1 で

MyAppData.GlobalData = new List<MyObjects>();
MyAppData.GlobalData.Add(new MyObjects(......));

そしてForm2で

if(MyAppData.GlobalData.Contains(.......))
于 2012-06-20T20:03:26.363 に答える