0

現在、form2からform 1に1つの配列リストを送信していますが、正常に動作します。

Form1 form2 = new Form1(this, SampleArrayList); //pass form reference and an arraylist
form2.Show();
this.Hide();

そしてform1で、SampleArrayListをローカル配列リストに関連付けます。

Form2 formParent;
ArrayList SampleArrayList;
public MainForm(Form2 par, ArrayList _SampleArrayList)
{            
       InitializeComponent();
       this.formParent = par;
       this.SampleArrayList = _SampleArrayList;
}

ただし、Form1の新しいインスタンスを作成することは避けたい

form2 = new Form1(this, SampleArrayList);

現在実行中のForm1のインスタンスに配列リストを送信したい。これを行うための最良の方法は何でしょうか。ありがとうございました

4

4 に答える 4

1

アプリケーション内で通信プラットフォームとして機能する静的クラスが問題を解決するか、両方のフォームが同じオブジェクトによって所有される可能性があります。

于 2012-04-19T16:04:56.570 に答える
1

上記のコメントでのOPの引用:

Form1が最初に作成され、[追加]ボタンをクリックするとForm2が作成されます。[送信]ボタンをクリックすると、Form2が非表示になり、破棄したくない古いインスタンスとともにForm1の新しいインスタンスが作成されます。[送信]ボタンをクリックして、Form1の実行中のインスタンスに戻ります。

それは本当に大きな問題です。これが私が好きな素晴らしい解決策です。

public partial class Form1 : Form
{
    private string dataFromThisForm; //can be whatever
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 otherForm = new Form2();
        //pass some data to other form
        otherForm.SomeData = dataFromThisForm; 

        this.Hide();
        otherForm.Show();

        //when the other form is closed
        otherForm.FormClosed += (sender2, e2) =>
        {
            this.Show();

            string newData = otherForm.NewData;
        };

        //when the other form is hidden.
        otherForm.VisibleChanged += (sender2, e2) =>
        {
            this.Show();

            string newData = otherForm.NewData;
        };
    }
}
public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        //Use SomeData to populate controls.
    }

    public string SomeData { get; set; } //data passed in from other form

    public string NewData { get; private set; }  //data to expose to other form

    private void button1_Click(object sender, EventArgs e)
    {
        NewData = "SomeDataToPassToForm1";
        //this.Close();
        this.Hide();
    }
}

いくつかの注意:

  • ArrayListこの例で行ったように、文字列ではなく、を渡します。AnArrayListは変更可能な参照型ですが、 stringは不変です。つまり、 ArrayListForm2に渡されたものを変更するだけで、これらの変更は両方とも同じ基になるを指しているため、Form1の変数に反映されます ArrayList。ただし、一般的なケースをカバーしているため、このコードはここに残しました。
  • 送信ボタンをクリックすると、Form2を非表示にすると言います。通常、このデザインでは、もう必要ないため、閉じます。本当に再度使用する予定がない場合は、閉じることをお勧めします。本当にそのフォームをもう一度表示する予定がある場合は、非表示にするだけで問題ありません。
  • 送信時にForm2を閉じると、FormClosingイベントが発生し、非表示にすると、Visibleイベントが発生します。実際に閉じるか非表示にするかに応じて、コード内の2つのイベントハンドラーのいずれかを削除する必要があります。時々一方を行い、時にはもう一方を行う場合は、両方を自由に残してください。1つだけを使用しても、両方を残しておけば、(混乱する人を除いて)実際には何も害を及ぼすことはありません。
于 2012-04-19T17:02:45.077 に答える
0

配列リストを受け入れるメソッドをForm1に追加します。

何かのようなもの:

public void Setup(ArrayList SampleArrayList)
{
    // Do what you need here...
}

次に、コンストラクター内からこのメソッドを呼び出し(コンストラクターを同じに保つため)、フォームが使用しているリストを変更する必要がある場合はSetupを呼び出すことができます。

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

// If you needed a new instance of Form1, it wouldn't change
Form1 form2 = new Form1(this, SampleArrayList); //pass form reference and an arraylist
form2.Show();
this.Hide();

// If you already had an instance in the form2 variable
form2.Setup(SampleArrayList);

いずれにせよ、.NET 2.0以降を使用している場合は、ArrayListの代わりに汎用リストを使用してリストデータを格納することをお勧めします。

于 2012-04-19T16:04:34.967 に答える
0

Form1インスタンスを作成する必要がない場合は、クラスに静的プロパティを記述できます。例えば:

private static ArrayList _SampleArrayList;
public static ArrayList SampleArrayList
{
    get { return _SampleArrayList; }
    set { _SampleArrayList = value; }
}

ArrayList書き込みを更新したい場合は、次のようにします。

 Form1.SampleArrayList = SampleArrayList;

PS:List<>の代わりに使用することをお勧めしますArrayList

elseをArrayList使用する代わりに、タイプがわからない場合。List<object>List<T>

編集:

form1form2が両方とも同じクラスのインスタンスである場合は、静的にするだけで済みますArrayList

于 2012-04-19T16:27:07.620 に答える