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;
}
这样你大可以先在窗体上设计好你的控件,不用自己写代码。