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

[ 最新記事及び返信フォームをトピックトップへ ]

■34143 / inTopicNo.1)  リストを別フォームに渡す方法
  
□投稿者/ 包装紙 一般人(1回)-(2019/02/19(Tue) 16:03:33)
  • アイコン環境/言語:[vs 2013 c# .net4.5] 
    分類:[.NET] 

    Form1とForm2があります。Form1からForm2を生成しています。
    
    Form1
    private void Form1_Load(object sender, EventArgs e)
    {
    	textBoxAddress.Text = "";
    	textBoxZipCode.Text = "";
    
    	var f2 = new Form2(this);
    	f2.ShowDialog();
    }
    
    Form2ではテキストボックスが3つあります。テキストボックスにユーザーが値を入力します。
    textBoxName1.Text = "YAMADA";
    textBoxName2.Text = "TARO";
    textBoxSex.Text = "MALE";
    
    var lst = new list<string>();
    lst.Add(textBox1.Text);
    lst.Add(textBox2.Text);
    lst.Add(textBox3.Text);
    
    ここからがやりたい事なのですが、Form2でボタンが押された時、このlstをForm1側に渡したいです。
    
    やりたい事:
    ・Form2のリストをForm1に渡す
    ・Form1でリストを受け取る
    ・SQLを生成。select * from Master where name1 = lst[0] and name2 = lst[1] and sex = lst[2]みたいなSQLを生成して問合せ
    ・必ずデータが見つかるという前提
    ・Form1のtextBoxAddress、textBoxZipCodeにデータベースに問い合わせて見つかった値を入力
    
    といった事がやりたいです。
    
    わからない事:
    ・リストをForm1にわたす方法がわかりません。
    ・form1では受け取った後にSQLを生成して問い合わせるという事をしたいのですが、Form2からリストを受け取ったら発動するようなイベントの作成方法
    
    宜しくおねがいします。

マルチポストを報告
違反を報告
引用返信 削除キー/
■34144 / inTopicNo.2)  Re[1]: リストを別フォームに渡す方法
□投稿者/ 魔界の仮面弁士 大御所(1197回)-(2019/02/19(Tue) 16:26:23)
  • アイコンNo34143に返信(包装紙さんの記事)
    > ここからがやりたい事なのですが、Form2でボタンが押された時、このlstをForm1側に渡したいです。

    === 案1 ===
    FontDialog クラスの Apply イベントを真似て、
    Form2 側に独自のイベントを設けておき、
    イベント引数またはプロパティで List<string> を返すようにする。


    === 案2 ===
    Form1 側でコールバック用のデリゲートを用意しておき、
    そのデリゲートを Form2 のコンストラクタに渡すようにする。


    > var f2 = new Form2(this);
    > f2.ShowDialog();

    Show メソッドの場合は上記で良いのですが、
    ShowDialog メソッドの場合は、Dispose が必須です。

    using ( var f2 = new Form2(this) )
    {
     f2.ShowDialog(this);
    }


    https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.form.showdialog
    >>> ダイアログ ボックスとして表示されているフォームは
    >>> Close メソッドで閉じられることはないため、
    >>> フォームがアプリケーションで不要になった場合は、
    >>> そのフォームの Dispose メソッドを呼び出す必要があります。
違反を報告
引用返信 削除キー/
■34145 / inTopicNo.3)  Re[1]: リストを別フォームに渡す方法
□投稿者/ kiku 一般人(5回)-(2019/02/19(Tue) 16:47:51)
  • アイコン
    こんな感じかな。
    
        public partial class Form1 : Form
        {
            private List<string> lst;
    
            public Form1()
            {
                InitializeComponent();
                lst = new List<string>();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                using(var f = new Form2())
                {
                    f.ShowDialog();
                    this.lst = f.lst;
                }
    
                label1.Text = string.Join(",", lst);
            }
        }
    
        public partial class Form2 : Form
        {
            public List<string> lst;
    
            public Form2()
            {
                InitializeComponent();
                lst = new List<string>();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                lst.Add("test1");
                lst.Add("test2");
                lst.Add("test3");
                lst.Add("test4");
    
                Close();
            }
        }
    

違反を報告
引用返信 削除キー/
■34146 / inTopicNo.4)  Re[2]: リストを別フォームに渡す方法
□投稿者/ 魔界の仮面弁士 大御所(1198回)-(2019/02/19(Tue) 16:59:25)
  • アイコン2019/02/19(Tue) 18:37:38 編集(投稿者)

    No34143に返信(包装紙さんの記事)
    > textBoxAddress.Text = "";
    > textBoxZipCode.Text = "";
    この 2 つの TextBox は、Form1 上にあるのですよね。


    > Form2ではテキストボックスが3つあります。テキストボックスにユーザーが値を入力します。
    > textBoxName1.Text = "YAMADA";
    > textBoxName2.Text = "TARO";
    > textBoxSex.Text = "MALE";
    この 3 つの TextBox は、Form2 上にあるのですよね。


    > lst.Add(textBox1.Text);
    > lst.Add(textBox2.Text);
    > lst.Add(textBox3.Text);
    この 3 つの TextBox は何でしょう?
    Form2 にある先の 3 つの TextBox の別名でしょうか。



    No34144に追記(魔界の仮面弁士の記事)
    > === 案1 ===
    > FontDialog クラスの Apply イベントを真似て、
    > Form2 側に独自のイベントを設けておき、
    > イベント引数またはプロパティで List<string> を返すようにする。


    【案1の実装例】

    public partial class Form1 : Form
    {
     private void Search(List<string> list)
     {
      // 実際は SQL での問い合わせを実施
      textBoxAddress.Text = "住所" + list.Count;
      textBoxZipCode.Text = "郵便番号";
     }

     private void button1_Click(object sender, EventArgs e)
     {
      using (var dialog = new Form2())
      {
       dialog.Apply += delegate { Search(dialog.CurrentList); };
       if (dialog.ShowDialog(this) == DialogResult.OK)
       {
        Search(dialog.CurrentList);
       }
      }
     }
    }

    public sealed partial class Form2 : Form
    {
     private void Form2_Load(object sender, EventArgs e)
     {
      // 下記はコードではなく、デザイン時に指定しておけば OK。
      button1.Text = "OK";
      button2.Text = "キャンセル";
      button3.Text = "適用";
      button1.DialogResult = DialogResult.OK;
      button2.DialogResult = DialogResult.Cancel;
      button3.DialogResult = DialogResult.None;
      AcceptButton = button1;
      CancelButton = button2;

      // button3.Click イベントへの「button3_Click」割り当ても忘れずに。
      // button1 / button2 の Click イベントは何も割り当てなくても構わない。
     }

     // Form2 の CurrentList プロパティは、
     // Form2 側の入力値を List<string> で返すためのもの
     public List<string> CurrentList
     {
      get
      {
       return new List<string>
       {
        textBoxName1.Text,
        textBoxName2.Text,
        textBoxSex.Text,
       };
      }
     }

     // Form2 の Apply イベントは、
     // Form2 の「適用」ボタン(button3)が押された事を知らせるもの
     public EventHandler Apply;

     private void button3_Click(object sender, EventArgs e)
     {
      // button3 が押されたら、Apply イベントを発火する
      Apply?.Invoke(this, EventArgs.Empty);
     }
    }
違反を報告
引用返信 削除キー/
■34147 / inTopicNo.5)  Re[2]: リストを別フォームに渡す方法
□投稿者/ 包装紙 一般人(1回)-(2019/02/19(Tue) 17:31:16)
  • アイコン今までShowDialogを使う時はDisposeしてなかったです(汗)助かりました。

    &#9747;↓
    lst.Add(textBox1.Text);
    lst.Add(textBox2.Text);
    lst.Add(textBox3.Text);

    ○↓
    >lst.Add(textBoxName1.Text);
    >lst.Add(textBoxName2.Text);
    >lst.Add(textBoxSex.Text);

    間違えしていました。失礼しました。
違反を報告
引用返信 削除キー/
■34148 / inTopicNo.6)  Re[3]: リストを別フォームに渡す方法
□投稿者/ 包装紙 一般人(2回)-(2019/02/19(Tue) 17:40:13)
  • アイコンkiku さん
    これだとlstをForm1の方で取得できそうですね。
    ただ、lstをForm2からForm1に渡したタイミングでイベントを
    起こせなかったりします。でも、lstの渡し方の参考になりました。
    ありがとうございます。
違反を報告
引用返信 削除キー/
■34149 / inTopicNo.7)  Re[4]: リストを別フォームに渡す方法
□投稿者/ 包装紙 一般人(3回)-(2019/02/19(Tue) 17:41:59)
  • アイコンよく考えたら、Form2のリストをForm1に渡さなくても、
    Form2でSQLを実行してForm2で実行結果を取得。
    取得した値をForm1の各テキストボックスに入れてあげた方が
    簡単そうな気がしました・・・
違反を報告
引用返信 削除キー/
■34150 / inTopicNo.8)  Re[5]: リストを別フォームに渡す方法
□投稿者/ 包装紙 一般人(4回)-(2019/02/19(Tue) 17:43:16)
  • アイコン魔界の仮面弁士さん

    むむむ、私の今の能力では読み解くのに時間がかかりそうです。
    一度ゆっくり紐解きながら読んでいきたいと思います。
    ありがとうございます!
違反を報告
引用返信 削除キー/
■34151 / inTopicNo.9)  Re[6]: リストを別フォームに渡す方法
□投稿者/ 包装紙 一般人(5回)-(2019/02/19(Tue) 17:46:39)
  • アイコンTextBoxは全て、Form上に配置されているものになります。
違反を報告
引用返信 削除キー/
■34152 / inTopicNo.10)  Re[7]: リストを別フォームに渡す方法
□投稿者/ 魔界の仮面弁士 大御所(1199回)-(2019/02/20(Wed) 09:26:43)
  • アイコン2019/02/20(Wed) 09:32:12 編集(投稿者)

    No34151に返信(包装紙さんの記事)
    > TextBoxは全て、Form上に配置されているものになります。

    各コントロールを操作するのは、その親フォームが担当するべきなので、
    textBoxAddress や textBoxZipCode の読み書きは Form1 上に記述すべきですし、
    textBoxName1/2 や textBoxSex の操作は Form2 にやらせるべきですね。



    No34143に返信(包装紙さんの記事)
    > Form2でボタンが押された時、このlstをForm1側に渡したいです。
    この「ボタン」というのが、Form2 を閉じるための OK ボタンなのか、
    先の No34146 で示した適用ボタンにあたるのかでも変わってきます。


    ダイアログを閉じた時に List<string> を得られれば良いのであれば、
    Form1 側から MessageBox.Show 感覚で呼べるよう、

     private void button1_Click(object sender, EventArgs e)
     {
      List<string> lst = Form2.ShowUserDialog(this);
      //
      // この後で、lst を使ってデータ検索し、
      // Form1 上にある textBoxAddress / textBoxZipCode に表示する
      //
     }

    と書けるような static メソッドを設けてしまうのも一考かも知れません。
    たとえばこんな感じです。

    public partial class Form2 : Form
    {
     public Form2()
     {
      InitializeComponent();
     }

     public static List<string> ShowUserDialog(IWin32Window owner)
     {
      using (var dlg = new Form2())
      {
       if (dlg.ShowDialog(owner) != DialogResult.OK)
       {
        // 右上 × ボタンで閉じられたら、空の List<> を返す
        return new List<string>();
       }
       else
       {
        // OK ボタンで閉じられたら、ユーザー入力値を返す
        return new List<string>
        {
         dlg.textBoxName1.Text,
         dlg.textBoxName2.Text,
         dlg.textBoxSex.Text,
        };
       }
      }
     }
    }


    上記実装の場合、Form2 上に OK ボタンを設ける必要があります。
    デザイン時に、Form2 上に OK ボタンを貼っておき、
    それの DialogResult プロパティを "OK" にしておいてください。
    (必要に応じて、キャンセルボタンも併設すると良いかも)



    No34149に返信(包装紙さんの記事)
    > Form2でSQLを実行してForm2で実行結果を取得。
    > 取得した値をForm1の各テキストボックスに入れてあげた方が
    > 簡単そうな気がしました・・・

    本質は一緒ですよね。

    データベース操作を Form1 だけに集約させるのか、それとも
    Form2 からもデータベース操作を行わせるかという違いはありますが、
    当初の質問であるデータの受け渡しという本質については変わりません。

    やるべきことは
     『Form2 のダイアログから、呼び出し元の Form1 に情報を返したい』
    という点にあるはず。

    そのときに渡すべき情報が
     ・Address 文字列
     ・ZipCode 文字列
    という「検索結果」に変わっただけでなので、最初の質問の
     ・textBox に入力された Name1 文字列
     ・textBox に入力された Name2 文字列
     ・textBox に入力された Sex 文字列
    という「ユーザー入力値な List<string>」を返す場合と同じ手順が使えるでしょう。


    今までに提案してきた『データの渡し方』としては、以下の物があります。

    ・Form2 の静的メソッドの戻り値として返すパターン(本投稿の ShowUserDialog メソッド)
    ・Form2 のインスタンスプロパティとして返すパターン( No34146 の CurrentList プロパティ)
    ・Form2 のイベント引数で返すパターン( No34144 の案1)
    ・コールバック用のデリゲートを Form1 側から Form2 に渡しておくパターン( No34144 の案2)
違反を報告
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

Mode/  Pass/


- Child Tree -