2017年3月29日水曜日

C# 複数のフォーム間でデータの受け渡しをする方法

複数のフォームでデータを行き来させたい場合、
どの様なやり方があるのか、調べてみた。

準備



新しいプロジェクトを作成



「Form1」へ
「ツールボックス」から
「Button」と「TextBox」を配置



「プロジェクト」->「新しい項目の追加」
で「Windowsフォーム」を追加する。



追加した「Form2」へ
「ツールボックス」から
「TextBox」を配置



「Form1」のボタンをダブルクリックして、
「クリック時イベント」のコードを表示させておきます。


「Form1」からモーダルで「Form2」を呼び出す



モーダルで「Form2」を呼び出すには2つの方法があります。
普段はリソースの解放が自動で行われる「using」の方を使います。
事情により使い分けます。

2つの方法のどちらかを記述して、
一度ここ迄で実行してみましょう。
ボタンを押すと「Form2」がモーダルで実行されるはずです。


Form間でデータの受け渡しを行う



「Form1」と「Form2」の間でデータの受け渡しを行います。

「Form2」へ
「ツールボックス」から
「Button」を配置して下さい。


「Form2」の配置したボタンをダブルクリックして、
「クリック時イベント」のコードを表示させておきます。


次に、
「Form2」デザインのイベントから
「FormClosing」をダブルクリックして、
「Form終了時イベント」のコードを表示させておきます。




準備が出来たので、
Form間でのデータ受け渡しの
いくつかのパターンを記載します。


●パターンA

「Form2」側で「Form1」のインスタンスを取得して、
「Form1」の持っているデータの取得や設定をしたいので、
以下のようにします。

これで実行してみて下さい。
Form間でデータの受け渡しができるハズです。

このパターンAの方法だと、
「Form1」に自身のインスタンスの格納用メンバを用意して、
それに対してstaticを適用しています。

1つの「Form1」しか同時に使用しない場合はこれで大丈夫ですが、
複数の「Form1」のインスタンスを同時に使用する場合、
インスタンスの格納用メンバがstaticの為、
クラス内でstatic部分が共有されてしまい、
うまく動きません。

ですが、
普通は同一Formを複数同時に使う事はないので、
これでも問題ありません。


●パターンB

「Form1」から「Form2」をnewする際に
「Form1」のインスタンスを「Form2」へ
引数として渡す事により、
「Form2」から
「Form1」の持っているデータの取得や設定をしたいので、
以下のようにします。

パターンAと比べると、
「Form1」からstaticが無くなり、
いくらかすっきりしました。

Form間のデータ受け渡し内容がシンプルな物であれば、
このパターンを使用するのがよさそうです。

これなら複数Formのインスタンスを作らなくては
いけない場合でも問題無く動きそうです。


●パターンC

「Form2」側に自身でダイアログを生成して、
表示させる自家製メソッドをstaticで用意。
引数と戻り値にリストを使用する事により、
フォーム間でデータの受け渡しを行います。

「Form1」側は「Form2」へ渡したいデータをリスト化し、
「Form2」自家製メソッドを引数付きで呼びます。
「Form2」のフォーム表示後、戻り値のリストを取り出し、
「Form1」内で利用します。



これは、
受け渡したいデータが増えても、
「Form1」側に無駄にpublicが増えず、
格納するデータの順番さえちゃんと管理できれば楽そうです。

「Form2」自身で自分のインスタンスの生成、表示をやってくれるので
「Form1」側から見たときに、使いやすそうです。



0 件のコメント:

コメントを投稿

↑Topへ