- PR -

C#で画面上の複数コントロールの配列化

投稿者投稿内容
ラオウとトキ
常連さん
会議室デビュー日: 2002/07/18
投稿数: 34
投稿日時: 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#なので他の方法でできそうですが、
どのようにしたら出来るのかわかりません。
どなたかお助けお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2003-11-13 19:17
以下が参考になるかと

http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_013/csharp_abc05.html

ラオウとトキ
常連さん
会議室デビュー日: 2002/07/18
投稿数: 34
投稿日時: 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.の方法でできたら理想なのですが、
どうやったらできるでしょうか?
フォームのコレクションでもとれてこれればできるような気がするのですが、
いまいちこれもやり方がわからない次第です・・。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 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++;
}
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-14 13:20
System.Collections.ArrayListを利用して、疑似配列化する。

System.Collections.CollectionBaseから派生したコレクションクラスを作成し、格納する。

System.Collections.Specialized.NameValueCollectionBaseから派生したコレクションクラスを作成し、格納する。

コントロールを動的に作成して、配列化する。



どれにします?
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-11-14 13:24
ラオウとトキさん、こんにちは。

自前で配列にすればよいのではないかと....。

コード:

Button[] buttonarray = new Button[] {this.button1, this.button2, this.button3};

for (int i = 0; i < buttonarray.Length; i++)
{
buttonarray[i].Text = i.ToString();
}



コントロールを動的に生成したりしているなら、ArrayList を使うという手も。


[ メッセージ編集済み 編集者: きくちゃん 編集日時 2003-11-14 13:25 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-14 13:45
こんにちわ。諸農です。
引用:

フォームのコレクションでもとれてこれればできるような気がするのですが、
いまいちこれもやり方がわからない次第です・・。



以下のような感じのクラスを作っておけばいいかも。
エラー処理のハンドリングもない、コントロールの順番も無保証な
適当なクラスなんですが。。。
欲を言えば、デザイナで利用できるようにするのがいいかも。

コード:
using System;
using System.Collections;
using System.Windows.Forms;

namespace ButtonArray
{
	public class ButtonList:ArrayList
	{
		Form _Owner = null;
		public ButtonList(Form AForm)
		{
			 _Owner = AForm;
			 FindButtons(AForm);
		}
		public Form Owner{
			get
			{
				return _Owner;
			}
			set
			{
				_Owner = value;
				FindButtons(value);
			}
		}
		private void FindButtons(Form AForm)
		{
			if (AForm != null)
			{
				this.Clear();
				foreach (Control o in AForm.Controls)
				{
					if (o is Button)
					{
						this.Add(o);
					}
				}
			}
		}
		public new Button this[int IDX]
		{
			get
			{
            	return (Button)this[IDX];
			}
		}
	}
}

//使い方は、こんな感じかな。。。。
//フォームに8個のボタンと1つのListBoxを配置しています。
//ボタン8のクリックイベントでボタンのテキストをリストボックスに表示。

private ButtonList bl;
private void WinForm_Load(object sender, System.EventArgs e)
{
	bl = new ButtonList(this);
}

private void button8_Click(object sender, System.EventArgs e)
{
	foreach (Button b in bl)
	{
		listBox1.Items.Add(b.Text);
	}
}




ではでは(^^)/
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
ラオウとトキ
常連さん
会議室デビュー日: 2002/07/18
投稿数: 34
投稿日時: 2003-11-14 13:45
うーむ。なるほど・・。
皆様ありがとうございます!
やっと何やら自分の目指す談義になってきてありがたいです。
(もとはといえば自分がいけないのですが・・。)
まずは、ArrayListで試してみたいと思います。

あとJittaさんのArrayList以外のコレクションオブジェクトを、
利用した方法も気になる所です。
CollectionBaseとNameValueCollectionBase・・
どっちがコンパクトなソースを書けるものなのでしょうか??

スキルアップ/キャリアアップ(JOB@IT)