- ベストアンサー
C# Form1 で得たデータを Form2 で活用する方法
- 初めて質問させていただきます。この度、初めてVisual Studio 2008のC#とMySQLの組み合わせで、郵便番号から住所を検索するプログラムを作成しています。Form1に設置したTextboxに郵便番号を入力し、ボタンをクリックするとデータベースから該当するデータを読み込む処理までは何とか作成できました。
- しかし、郵便番号の一部を入力して、該当する住所が複数件数になる場合、Form2にListViewを設置して、リスト形式で表示する方法がわかりません。初心者なので参考にした質問の回答をうまく処理できませんでした。
- 質問ですが、C#のForm1で得たデータをForm2で活用する方法について教えてください。また、C#とMySQLの組み合わせで郵便番号から住所を検索するプログラムを作成しましたが、郵便番号の一部を入力して複数の住所を表示する方法がわかりません。初心者ですので、詳しい方法を教えていただければ幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
・Form1に「住所を複数件入れる為のリストの変数」を作り、パブリックメンバにする。また「どの住所が選ばれたのかを受け取る変数」も作り、同様にパブリックメンバにする。 ・Form1のどこか(複数件あると判り、複数の住所を上記の住所リストの変数に格納し終わった所)で、Form2を作成する。作成だけでまだ表示はしない。 ・Form2ではコンストラクタか、フォームが作成された場合に呼ばれるイベント関数で「Form1->リストの変数」にアクセスし、Form2(自分)のListViewにアイテムを追加していく。また「OK」ボタンを押せないようにしておく。 ・Form1のどこかでForm2を作成し終ったら、もう既にForm2のListViewに値が設定され終わっているので、モーダル付きでForm2を表示する。 ・Form2では、ListViewでどれか1つを選択したら、「OK」ボタンを押せるようにする。 ・Form2の「OK」ボタンは、押されたら、ListViewの選択中のアイテムの中身(住所)をForm1の結果返却用のパブリックなメンバ変数に代入し、モーダルの返り値を「MR_OK」にして、Form2自身を閉じる。 ・Form2の「キャンセル」ボタンは、押されたら、モーダルの返り値を「MR_CANCEL」にして、Form2自身を閉じる。 ・Form1のどこかでモーダル付きでForm2を表示した場合は、Form2で「OK」か「キャンセル」のどっちを押したかで、返り値が「MR_OK」か「MR_CANCEL」になる。この値を見て「処理を続けるかどうか」を判断する。 ・モーダル付きで表示し終わったForm2は「閉じられただけで、まだ存在したまま」なので、後始末して解放する。処理を続ける場合も続けない場合も後始末は必要。 ・処理を続ける場合、結果返却用のパブリックなメンバ変数に、何が選ばれたか既に入っているので、それを使用する。 ・処理を続けない場合、郵便番号の再入力などを行わせ、最初からやり直す(郵便番号の所にフォーカスを移す、など)
その他の回答 (1)
- smcss
- ベストアンサー率63% (7/11)
とりあえず安直な方法ですが、検索結果を form1 のpublic プロパティで公開してやれば別フォームからでもアクセスできます。 他には form2 を生成するときにコンストラクタで検索結果を渡すとか。form2 に検索結果を受け取るメソッドを定義しておくとか。
お礼
お世話になります。 あれから、コンストラクタについて詳細に調べ、自己解決できました。 結局あれこれしすぎたことが原因で混乱していました。 大変参考になるヒントをいただき、ありがとうございました。
補足
初めまして。お世話になります。 大変参考になるご教授、ありがとうございます。 まだ勉強不足なので、おかしなことをしているかもしれませんが、現状ソース(一部抜粋)は下記のようになっています。 コンストラクタ自体もよくわかっていなかったので、調べてみて自分なりに解釈して使ってみました。 しかし、ビルドエラーは出ないものの、実行中にシステムエラーが出るようになりました。 ------------------------------------------------------- //Form1側処理(検索ボタンがクリックされてからの処理になります) public struct AddressData { string ZipCode; string Prefecture; string Address1; string Address2; public AddressData(string _ZipCode, string _Prefecture, string _Address1, string _Address2) { ZipCode = _ZipCode; Prefecture = _Prefecture; Address1 = _Address1; Address2 = _Address2; } public string _ZipCode { get { return ZipCode; } set { ZipCode = value; } } public string _Prefecuture { get { return Prefecture; } set { Prefecture = value; } } public string _Address1 { get { return Address1; } set { Address1 = value; } } public string _Address2 { get { return Address2; } set { Address2 = value; } } } private ArrayList AddressList = new ArrayList(); public ArrayList AddLst { get { return AddressList; } set { AddressList = value; } } public zipcode() { InitializeComponent(); } private void btnAddrSearch7_Click(object sender, EventArgs e) { formZip2AddressList frmZ2A = new formZip2AddressList(); // 郵便番号→住所変換用フォームのインスタンス作成 CurrencyManager clm = null; // DBに接続するための準備 try { ArrayList List = connectorMySQL.DBdataRead(dbElements, "SELECT zip,addr1,addr2,addr3 FROM JAPAN_POST WHERE zip LIKE '" + txtbxZipCode7.Text + "%'"); clm = (CurrencyManager)this.BindingContext[List]; if (List.Count >= 5) { // ・・・途中略・・・ for (int i = 0; List.Count / 4 > i; i++) { // 読み込んだ住所データをListViewに格納したいが、システムエラーになる(ListViewにバインドできない) frmZ2A.Zip7ToAddressList.DataBindings.Add("Text",List,"_ZipCode"); frmZ2A.Zip7ToAddressList.DataBindings.Add("Text", List, "_Prefecture"); frmZ2A.Zip7ToAddressList.DataBindings.Add("Text", List, "_Address1"); frmZ2A.Zip7ToAddressList.DataBindings.Add("Text", List, "_Address2"); clm.Position++; } frmZ2A.Show(); // 郵便番号→住所変換用フォーム表示 } else { // 読み込んだ住所データをTextBoxに格納したいが、システムエラーになる(TextBoxにバインドできない) txtbxZipCode7.DataBindings.Add("Text", List, "_ZipCode"); comboxPrefecture.DataBindings.Add("Text", List, "_Prefecuture"); txtbxAddr1.DataBindings.Add("Text", List, "_Address1"); txtbxAddr2.DataBindings.Add("Text", List, "_Address2"); clm.Position++; } } catch (Exception ex) { MessageBox.Show(this, "データベースエラーが発生しました : " + Convert.ToString(ex), "データベースエラー", MessageBoxButtons.OK, MessageBoxIcon.Error); comboxPrefecture.Text = null; txtbxAddr1.Text = null; txtbxAddr2.Text = null; txtbxZipCode7.Text = tmpTextBox[5]; } } // Form2処理は次の補足へ
お礼
お世話になります。 アドバイスをいただいた方法に沿ってやってみた結果、思った通りに動作するようになりました。 大変ご丁寧なアドバイス、ありがとうございました。
補足
初めまして。お世話になります。 早速のご回答ありがとうございます。 smcss様のご回答への補足になってしまいますが、Form2のソースを載せます。 何だかおかしな補足になってしまい、申し訳ございません。 -------------------------------------------------------- // 以下Form2側処理 private static formZip2AddressList _formInstance; public static formZip2AddressList formZip2AddressInstance { get { return _formInstance; } set { _formInstance = value; } } private ListView lstDBReadDataList = new ListView(); public ListView Zip7ToAddressList { get { return lstvDBReadDataList; } set { lstvDBReadDataList = value; } } public formZip2AddressList() { InitializeComponent(); } -------------------------------------------------------- まだ不足している情報などございましたら、ご指摘ください。 よろしくお願いいたします。