|
2014/03/13(Thu) 14:04:42 編集(投稿者)
# 投稿モードを図表モードにし忘れたので、コードのインデントが # 崩れてしまいました…全角空白でインデントしておきます。
■No70333 (まさおっち さん) に返信 > この処理、foreachを使っていますが1度しかループしていないので、ほかの方法もないかと思いまして・・・ Array.ForEach メソッドとか、List<T>.ForEach メソッドとか?
■No70334 (まさおっち さん) に返信 > foreach以外でコレクションの内の1つを変数(s)に入れる方法はないだろうか!? 最初の一個を取得するだけで良いのなら、 var s = _tool.FirstOrDefault(); と書くことができます。
特定の一要素ではなく、すべてを個別に取り出して 処理していきたいというのであれば、単純に foreach で 十分かと思いますが、どうしても foreach が嫌なのであれば、 Azulean さんが No70335 で示された方法などがありますね。
■No70337 (まさおっち さん) に返信 >>> foreach (var s in _tool) >>> { >>> var title=s.name; >>> } > > s.nameがt.nameとそれぞれ別の変数であれば > ここでいう s と t は、それぞれ何を意味しているのでしょうか? s については記載がありましたが、t についての説明が無いようです。
変数の名前からして、 s = _tool[0]; t = _tool[1]; u = _tool[2]; v = _tool[3]; w = _tool[4]; のようなイメージでなのでしょうか。 (_tool にインデクサがあるかどうかは別として)
>>実際に2回以上のループをどのように実装されて何が問題なのでしょうか? > ループの中でボタンを作成し、そのボタンにDLLで拾ってきた関数がひもづけられているのですが、 > 1周目で作成されたボタンと2周目で作成されたボタンに割り当てられる関数が同じになってしまって困ってます。
「DLLで関数を拾う」というのが良く分からず、 状況がまだ朧げにしか見えてこないのですが、現在は
// 同じ処理を割り当てる例 foreach(var s in _tool) { var btn = new Button() { Text = s.Name, Location = s.Position, Tag = s.Id }; Controls.Add(btn); // ループの中でボタンを作成し btn.Click += dllFunctionEventHandler; // DLL関連の関数を紐付け }
に相当する処理を行っているのでしょうか。
> ボタンに割り当てられる関数が同じになってしまって困ってます。 「ボタンに割り当てられる関数」というのは、上記のように Click イベントに対する イベントハンドラの割り当てという意味でよろしいでしょうか。
そうだとして、「同じ」になってしまうのが困る、という話については:
どちらのボタンが押されたのかが分からなくなる、という意図であれば sender 引数で判定できますし、個別情報を渡しておきたいなら Tag を使う手もあります。 あるいは、それぞれのボタンごとに別の処理を割り当てたいのなら、 ボタン1用の処理、ボタン2用の処理をそれぞれ分けて準備しておいて、 それらを個別に割り当てていけば良いかと思います。
以下、参考例:
//----- 案1:同じ処理を割り当てておき、イベントハンドラ内で判定する -----
// Click 時に処理させたい内容 void dllFunctionEventHandler(object sender, EventArgs e) { // 実際は if や switch などで分岐するなど var button = (Button)sender; MessageBox.Show(button.Tag as string, button.Text); }
private void button1_Click(object sender, EventArgs e) { var _tool = new[] { new {Name = "A", Position = new Point(1, 10), Id = "100"}, new {Name = "B", Position = new Point(1, 50), Id = "200"}, new {Name = "C", Position = new Point(1, 90), Id = "300"} };
foreach (var item in collection) { var btn = new Button() { Text = item.Name, Location = item.Position, Tag = item.Id }; Controls.Add(btn); // ループの中でボタンを作成し btn.Click += new EventHandler(dllFunctionEventHandler); // DLL関連の関数を紐付け } }
//----- 案2:ボタンごとに異なる処理を割り当てる ----- private void button1_Click(object sender, EventArgs e) { var collection = new[] { new {Name = "開く", Position = new Point(1, 10), Proc = new EventHandler(delegate { MessageBox.Show("A"); })}, // 匿名メソッド(引数省略) new {Name = "終了", Position = new Point(1, 50), Proc = new EventHandler(delegate(object o, EventArgs a) {this.Close();})}, // 匿名メソッド(引数あり) new {Name = "隠す", Position = new Point(1, 90), Proc = new EventHandler((o, a) => ((Control)o).Hide())}, // ラムダ式 new {Name = "呼ぶ", Position = new Point(1,130), Proc = new EventHandler(dllFunctionEventHandler)}, // デリゲートインスタンス };
foreach (var item in collection) { var btn = new Button() { Text = item.Name, Location = item.Position }; Controls.Add(btn); btn.Click += item.Proc; } }
|