DOBON.NET DOBON.NETプログラミング掲示板過去ログ

別に作成したフォームの値の参照方法

環境/言語:[windows 7 c#]
分類:[.NET]

form1とform2があります。
form1からform2のオブジェクトを作成します。

form2 f2 = new form2(); //インスタンス作成
f2.Show(); //モードレスで表示

Form2にはテキストボックス(txt1)があります。
txt1には任意の文字列が入っています。例えば「abc」など。

form1から、このform2のtxt1に入っている値を取得したいと思います。

この時、どのようにform1からform2の値を取得すればよいのでしょうか?
また、form2のtxt1のmodifiersはprivateになっています。
これはpublicに変更しないと、form1から値は取得できないんでしょうか?

よろしくお願いいたします。
■No32297に返信(たけしさんの記事)
> form1から、このform2のtxt1に入っている値を取得したいと思います。
> この時、どのようにform1からform2の値を取得すればよいのでしょうか?

(1) Form2 にイベントを追加して、Form2 が値を通知する方法
(2) Form2 にプロパティを追加して、Form1 が値を問い合わせる方法
(3) Form2 にメソッドを追加して、その戻り値として値を返すほう穂
(4) Form2 の TextBox の Modifiers を proteced 以上にして直接操作する方法

などといった手法があります。


まずは (1) のイベント実装。
このパターンは、FontDialog の Apply イベントなどで使われています。

    private void button1_Click(object sender, EventArgs e)
    {
        this.fontDialog1.ShowApply = true;
        this.fontDialog1.ShowDialog();
    }

    private void fontDialog1_Apply(object sender, EventArgs e)
    {
        // ダイアログの[適用]を押すと、ダイアログを閉じずとも反映される
        this.button1.Font = this.fontDialog1.Font;
    }

しかし、このパターンが必要になることはそう多くないので、
今回の Form2 に対する実装例コードは省略します。



(2) のプロパティ実装は、比較的簡単です。

たとえば、Form2 のタイトルを取得するために、
s = f2.Text; と書けますが、それと同じようにして、
s = f2.OriginalProperty; と書けるようにするための手法です。

具体的には下記のようなコードを用意するだけです。
処理手順としては、これが本命となるでしょう。

    // Form2 上に実装
    public string OriginalProperty
    {
        get { return this.txt1.Text; }
        set { if(this.txt1 != null) this.txt1.Text = value; }
    }

ReadOnly で十分な場合は、set {} をはずして get{} のみ実装してください。



(3) のメソッド実装は、考え方は (2) と同じです。
プロパティとメソッドのいずれを使うかは、好みで決めてしまっても構いません。

     public string GetTxtMessage()
     {
        return this.txt1.Text;
     }

上記は、値の取得だけのコードです。もしも値の設定もしたい場合は、
別途、設定用メソッドも用意しなければなりません。読み書き両方とも
行えるようにしたいのであれば、(2) のプロパティ実装の方が便利かと思います。


そして (4) は、デザイン時に txt1 の Modifiers を、初期の private から
internal (もしくは public) へと引き上げておくパターンです。

そうすれば Form1 側からでも、s = f2.txt1.Text; のようにして
Form2 上の txt1 の値を読み取ることができます。

しかし、txt1 そのものを公開するということは、そのコントロールのすべて
(表示・非表示、色、位置など)を、Form2 以外の場所から、自在に操作
できてしまうことになります。カプセル化の観点からは望ましく無いため、
この手法は、基本的に使うべきではありません。

Modifiers は原則として、「private」のままにしておくべきです。
使うとしても internal レベルにとどめておき、
public の利用は避けるようにしましょう。


…ちなみに VB だと、Modifiers の初期値が Private では無いため、
Modifiers をあえて変更せずともこの手法が使えるようになっています。
とはいえ、それを使うことが望ましくないという点においては、
VB であっても C# であっても一緒です。
魔界の仮面弁士さん

多くの例題ありがとうございます。一番簡単そうな(2)で成功致しました。
いまいちプロパティというものがよく理解できていなかったので、今回理解できました。本当にありがとうございます、助かりました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板