- 題名: 別に作成したフォームの値の参照方法
- 日時: 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から値は取得できないんでしょうか?
よろしくお願いいたします。