- - PR -
C#で画面上の複数コントロールの配列化
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-11-13 18:38
どもみなさま、お疲れ様です。
C#である開発をおこなっているのですが、 1つ疑問がでてきましたので投稿します。 VBだと複数のコントロールをデザイン画面で配置すると、 コントロールを配列にしますか?などと言うダイアログがでて、 コントロールの配列化をすることができ、 ソースを綺麗にまとめあげることができました。 例えば10個のボタンを配列化した場合、 クリックのイベントが起きた時には、 Private Sub Command1_Click(Index As Integer) のように1つのプロシージャで完結することができました。 しかしC#にはそのようなものがないようです。 現状ですと、 10個のボタンを配置した場合、 private void button1_Click(object sender, System.EventArgs e) private void button2_Click(object sender, System.EventArgs e) private void button3_Click(object sender, System.EventArgs e) ・ ・ となってしまいプログラムがダラダラと続いている状態です。 オブジェクト指向要素が強いC#なので他の方法でできそうですが、 どのようにしたら出来るのかわかりません。 どなたかお助けお願いします。 | ||||||||
|
投稿日時: 2003-11-13 19:17
以下が参考になるかと
http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_013/csharp_abc05.html | ||||||||
|
投稿日時: 2003-11-14 12:09
burton999さんご返事ありがとうございます。
ただすこし、話が遠まわしすぎました。すいません。 イベントの話というより、 「指定したコントロールに情報をセットしてやる。」 という質問だったつもりだったのですが、 うまく説明できてませんでした。ごめんなさい! 実際に今やろうとしていることは、 エンドユーザさんが入力したデータから(抽出条件によってデータの量が変動する) データを抽出し抽出したデータのテキストをボタンに貼り付けるという事がしたいです。 コントロールが配列にされている場合だと、 抽出データが複数件存在した場合ですと件数をINDEXとして、 ■1. int intIndex=0; while (ObjRead.Read()) { ←データが無くなるまでLOOPします。 button(intIndex).Text=ObjRead["抽出されたデータ"].ToString(); intIndex++; } という風にできますが今の現状ですと配列化できてませんので、 ■2. int intIndex=0; while (ObjRead.Read()) { ←データが無くなるまでLOOPします。 switch(intIndex) { case 0: this.button1.Text=「抽出されたデータ」; break; case 1: this.button1.Text=「抽出されたデータ」; break; ・ ・ ・ 続く } } とダラダラ見苦しくなってしまうので、 ■1.の方法でできたら理想なのですが、 どうやったらできるでしょうか? フォームのコレクションでもとれてこれればできるような気がするのですが、 いまいちこれもやり方がわからない次第です・・。 | ||||||||
|
投稿日時: 2003-11-14 13:17
この方法が正しいかは分かりませんが
私は下記の方法で実現してます。 //プロパティを定義 private System.Windows.Forms.Button[] myButtons { get { ArrayList buttons = new ArrayList(); buttons.Add(this.botton1); buttons.Add(this.botton2); . . . return (Button[])buttons.ToArray(typeof(Button)); } } int intIndex=0; while (ObjRead.Read()) { ←データが無くなるまでLOOPします。 this.myButtons.(intIndex).Text=ObjRead["抽出されたデータ"].ToString(); intIndex++; } | ||||||||
|
投稿日時: 2003-11-14 13:20
System.Collections.ArrayListを利用して、疑似配列化する。
System.Collections.CollectionBaseから派生したコレクションクラスを作成し、格納する。 System.Collections.Specialized.NameValueCollectionBaseから派生したコレクションクラスを作成し、格納する。 コントロールを動的に作成して、配列化する。 どれにします? | ||||||||
|
投稿日時: 2003-11-14 13:24
ラオウとトキさん、こんにちは。
自前で配列にすればよいのではないかと....。
コントロールを動的に生成したりしているなら、ArrayList を使うという手も。 [ メッセージ編集済み 編集者: きくちゃん 編集日時 2003-11-14 13:25 ] | ||||||||
|
投稿日時: 2003-11-14 13:45
こんにちわ。諸農です。
以下のような感じのクラスを作っておけばいいかも。 エラー処理のハンドリングもない、コントロールの順番も無保証な 適当なクラスなんですが。。。 欲を言えば、デザイナで利用できるようにするのがいいかも。
ではでは(^^)/ _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 2003-11-14 13:45
うーむ。なるほど・・。
皆様ありがとうございます! やっと何やら自分の目指す談義になってきてありがたいです。 (もとはといえば自分がいけないのですが・・。) まずは、ArrayListで試してみたいと思います。 あとJittaさんのArrayList以外のコレクションオブジェクトを、 利用した方法も気になる所です。 CollectionBaseとNameValueCollectionBase・・ どっちがコンパクトなソースを書けるものなのでしょうか?? |