メソッドが子フォームから呼び出された場合、どのように値を設定するのですか?

私のアプリケーションは現在2つのフォームを持っています。これは、次のコードで終了するサブフォームForm2を作成します。

public partial class Form2 : Form
{ ...
    Form1 frm = new Form1();
        frm.rglu = glu;
        frm.rdate = fulldate;
        frm.sort();
    Close();
}

form1は現時点では2つのボタンにすぎないことに注意してください。 Form2は次のように開始されます。

    private void button2_Click(object sender, EventArgs e)
    {
        using (Form2 AcqForm = new Form2())
        {
            AcqForm.ShowDialog(this);
        }
    }

後で示す test(); ボタンを除く他のコードは実行されません)。 この frm.sort(); は、Form1にある次のコードを実行します。

public partial class Form1 : Form
{
    public void sort() 
    {           
        datelist = new List(rdate);
        datelist.Sort((a, b) => a.CompareTo(b));

        var result = rdate
        .Select((d, i) => new { Date = d, Int = rglu[i] }) 
        .OrderBy(o => o.Date) 
        .ToArray();

        this.rdate = result.Select(o => o.Date).ToArray();
        this.rglu = result.Select(o => o.Int).ToArray();  //all works fine

        for (int i = 7; i+7 <= rglu.Length; i++)
        {
    Console.WriteLine(Convert.ToString(rdate[i]) + Convert.ToString(rglu[i]));
        } //This shows values as expected
    }
}

しかし、 rglu rdate を使っていくつかのコードを実行するようにボタンを設定すると、

public partial class Form1 : Form
{ 
    private void test(object sender, EventArgs e)
    {
        for (int i = 7; i < rglu.Length; i++){} //rglu is null! The values are lost.
    }
}

私は、このソリューションには int [] rglu {get; set;} メソッドを使用します。しかし、これまで私はこれらのことをまったく使っていない。誰もこの問題に遭遇しましたか?

編集: rgluは次のように定義されます:

public int[] rglu { get; set; } //I don't get how this works though
0
test()を呼び出す前に Sort()が実行されていますか?
追加された 著者 CJBrew,
最初のスニペットで Close()を呼び出すと、Form2を閉じたと思いますか?あなたが提供していないいくつかのコードでForm1を起動しましたか? Form1またはForm2の test()メソッドはありますか?
追加された 著者 CJBrew,
rglu が定義されている class Form1 の部分を投稿できますか?
追加された 著者 CJBrew,
はい、事前に呼び出されています。
追加された 著者 user961437,
はいフォーム2は、ソートが実行された後に閉じます私は信じています。テストは様式1にあります。
追加された 著者 user961437,
さて、私はやった。
追加された 著者 user961437,

3 答え

Form1 frm = new Form1();
frm.rglu = glu;
frm.rdate = fulldate;
frm.sort();
Close();

他の場所で frm 変数を使用せず、フォームを表示しないので、そのデータを rdate および > rglu 変数を使用します。

すでに存在するフォームを操作したいと思うようです。この場合、既存の Form1 への参照を Form2 のメソッドに渡す必要があります。

更新:

次のようになります。

public partial class Form2 : Form
{
   //...
    private readonly Form1 _parent;

    public Form2(Form1 parent) : this()
    {
        _parent = parent;
    }

   //... somewhere in a method which closes Form2:

        Form1 frm = _parent;
        frm.rglu = glu;
        frm.rdate = fulldate;
        frm.sort();
        Close();

   //...
}

Form1 から Form2 を表示するには、

using(var form2 = new Form2(this))
{
    form2.ShowDialog(this);
}
0
追加された
Form1 型のパラメータを Form2 コンストラクタに追加するのが最も簡単な方法です
追加された 著者 max,
回答に含まれる例
追加された 著者 max,
それも私の考えでしたが、これは非常に簡単なコードスニペットかもしれません。 Form1が表示されていない場合は、 Test()ボタンをクリックする方法がないため、情報が不足していると思います。
追加された 著者 CJBrew,
これはどうすればいいですか?
追加された 著者 user961437,
これがどのように行われたか私に見せてもらえますか?
追加された 著者 user961437,
フォーム1は空白のフォーム上の2つのボタン、1つはフォーム2を開き、1つはtest()を実行します。
追加された 著者 user961437,

純粋に防御的なコーディングスタイルの観点からは、メソッドを呼び出す前に rglu がnullであることをテストするのがよい方法だと思います。

例えば

public void test() 
{
    if(rglu == null)
    {
        throw new InvalidOperationException("rglu is null!");
    } 

    for (int i = 7; i < rglu.Length; i++){} //rglu is not null!
}

私はまた、ボタンclickイベントから呼び出された場合にtest()をなぜパブリックにする必要があるのか​​という疑問を抱いています。

0
追加された
私が示したより多くのコードがあります、私を許してください、私は質問のために簡素化しています。 test()は公開する必要はありません。
追加された 著者 user961437,

問題はform2にあり、 'Form1 frm = new Form1();'と書いてはいけません。このコード。

次のようなForm1 witeコードで:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public int rglu;
        public DateTime rdate;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnShowForm2_Click(object sender, EventArgs e)
        {
            Form2 frm2=new Form2();
            frm2.Form1Instance = this;
            frm2.Show();
        }
        public void sort()
        {
            datelist = new List(rdate);
            datelist.Sort((a, b) => a.CompareTo(b));

            var result = rdate
            .Select((d, i) => new { Date = d, Int = rglu[i] })
            .OrderBy(o => o.Date)//Sort by whatever field you want
            .ToArray();

            this.rdate = result.Select(o => o.Date).ToArray();
            this.rglu = result.Select(o => o.Int).ToArray();  //all works fine

            for (int i = 7; i + 7 <= rglu.Length; i++)
            {
                Console.WriteLine(Convert.ToString(rdate[i]) + Convert.ToString(rglu[i]));
            } //This returns values as expected
        }
    }
}

Form2でこのようなコードを書く:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form2 : Form
    {
        public Form1 Form1Instance;
        public Form2()
        {
            InitializeComponent();
        }

        private void btnSortValues_Click(object sender, EventArgs e)
        {
            Form1Instance.rglu = glu;
            Form1Instance.rdate = fulldate;
            Form1Instance.sort();
            Close();
        }
    }
}
0
追加された
ありがとうございました!!!!まさに私が探していたもの!
追加された 著者 user961437,