- 題名: 別に作成したフォームの値の参照方法
- 日時: 2014/04/22 20:04:14
- ID: 32297
- この記事の返信元:
- (なし)
- この記事への返信:
- [32300] Re[1]: 別に作成したフォームの値の参照方法2014/04/22 21:02:30
- ツリーを表示
■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# であっても一緒です。
分類:[.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から値は取得できないんでしょうか?
よろしくお願いいたします。