C#实现控件数组

DotNet里取消了控件数组,这让习惯了使用VB控件的程序员非常不适应。有什么办法能够实现控件数组的功能吗?答案是肯定的。

众所周知,控件数组最主要的两个优点:可以循环附值;可以响应同一个事件。从而大大简化了代码。下面根据这两个方面,举一个例子。

新建一个工程,在窗体上添加5个textbox(textBox1...textBox5)和2个button (button1、button2)。

1.循环附值

总的来说,有两种实现方法:

1.1 定义动态的控件数组。因为DotNet里支持动态的控件数组,所以我们可以把已设计好的控件,附给动态的数组,这样就可以任意的使用了。代码如下:

private void button1_Click(object sender, System.EventArgs e)

{

TextBox[] myTextBox = new TextBox[5];

myTextBox[0] = textBox1;

myTextBox[1] = textBox2;

myTextBox[2] = textBox3;

myTextBox[3] = textBox4;

myTextBox[4] = textBox5;

for ( int i=0;i< 5;i++)

{

myTextBox[i].Text = "fill_1";

}

}

1.2 利用窗体的控件数组。因为窗体里的控件,都被包括在Control里面,所以可以根据其类别加以区分。代码如下:

private void button2_Click(object sender, System.EventArgs e)

{

foreach(Control myControls in this.Controls)

{

if (myControls.ToString().IndexOf("TextBox") > 0 )

{

myControls.Text ="fill_2";

}

}

}

2.事件响应

让数组里的控件都响应同一个相应的事件,通过起在数组里唯一的标识,再将他们加以区分。下面一个例子,使5个textBox响应同一个keypress事件。

自定义一个控件事件-- textBox_KeyPress ,代码如下:

private void textBox_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)

{

TextBox box = (TextBox)sender;

MessageBox.Show(this,"you choose " + box.Name + " and you keypress " + e.KeyChar.ToString() ,"try" ,MessageBoxButtons.OK );

}

选定textBox1,按F4显示其属性页,选择"Events"按钮(就是那个小闪电),列出了textBox1的所有事件,在keypress里写我们想让他相应的事件的名字--textBox_KeyPress,这样,当textBox1产生keypress事件时,他相应的是textBox_KeyPress这个我们自定义的事件。同样,对其它的textBox控件也做如上的属性设置。这样,5个textBox同时响应一个keypress事件,而可以通过object sender的不同,可以加以区分。这样就达到了数组的效果。

用C#实现简单的控件数组

  我的一个同学在做计算器程序,另一个同学在做井字棋游戏。这两个程序有个共同的特点:包含数个具有同类功能的控件(计算器的数字按钮及井字棋的九个落子位)。如果一个个地创建这些控件,不得不写大量重复的代码,修改起来比较麻烦。一个更好的选择是建立控件数组。下面是Button数组的简单实现:

Button[] btns = new Button[9];

private void ShowButtonArray()

{

for(int i = 0; i < 9; i++)

{

btns[i] = new Button(); //这一句往往为初学者忽视,须知要创建对象的实例!

btns[i].Location = new System.Drawing.Point(100 + 50 * (i % 3),100 + 50 * (i / 3));

btns[i].Name = "btnTest";

btns[i].Size = new System.Drawing.Size(48, 48);

btns[i].Text = i.ToString();

btns[i].Click += new System.EventHandler(this.btns_Click); //统一的事件处理

this.Controls.Add(btns[i]); //在窗体上呈现控件

}

}

private void btns_Click(object sender, System.EventArgs e)

{

MessageBox.Show(((Button)sender).Text + " was clicked !"); //通过sender判断激发事件的控件

}

private void Form1_Load(object sender, System.EventArgs e)

{

ShowButtonArray();

}

  事实上,大家只要看一遍“Windows 窗体设计器生成的代码”,就很快能理解.Net创建并呈现控件的过程,从而写出简单的控件数组。在上例中,Button呈现的位置是通过一个的公式计算出的,在实际的运用中,可以根据需要灵活变化(比如计算器的数字按钮,1~9可以用公式算出,0则可以用if之类的语句特殊处理)。同时值得注意的是对事件的统一处理:在btns_Click函数中通过sender判断激发事件的控件。

  如果有必要,可以将控件数组封装成类,加上一定的功能代码,便于灵活使用。甚至可以将一些自定义控件做成数组类,实现更加复杂的功能。

给你举个例子吧:

在某个Form的某个方法中:

//先创建数组

Label[] lblArray = {new Label(),new Label()};

//设置属性

lblArray[0].Location = new System.Drawing.Point(132, 280);

lblArray[0].Name = "label_0";

lblArray[0].Size = new System.Drawing.Size(64, 16);

lblArray[0].TabIndex = 1;

lblArray[0].Text = "label_0";

lblArray[1].Location = new System.Drawing.Point(232, 280);

lblArray[1].Name = "label_1";

lblArray[1].Size = new System.Drawing.Size(64, 16);

lblArray[1].TabIndex = 2;

lblArray[1].Text = "label_1";

//最后一条语句尤其重要,如果不写,则控件不能在窗体上显示。

this.Controls.AddRange(lblArray);

逐个自己写代码啊,太烦了吧,看看这样行不行:

private System.Windows.Forms.Button[] ba={null, null};

private void Init()

{

ba[0]=button1;

ba[1]=button2;

}

这样你大可以先在窗体上设计好你的控件,不用自己写代码。