在课程设计中使用到了这种方法,能够提高效率和减少代码量。
有时候WinForm程序中会出现很多同类的控件,例如下图,就有10个 button
,5个 label
, 6个 pictureBox
问题如下:
1. 将所有的 button
和 label
的 Text
属性改为 Here
2. 将所有的 picture
的 BackColor
设置为红色
3. 将 button
的 Text
显示改为从0到9顺序
4. 用数组实现将将所有的 button
的 Text
属性改为 ArrayChange
标题算是给了提示,可以先试一试自己解决一下上面的问题。
题目:将所有的
button
和label
的Text
属性改为Here
在这里为了学习到Control
控件,将pictureBox
也变了吧
foreach (Control item in this.Controls)
item.Text = "Here";
解释:
foreach
后面括号里的 Control
是指 控件
, item
是自定义的名字, this.Controls
是指当前窗体(this
)的所有控件(Controls
)
结合起来的意思就是 “遍历当前窗体的所有控件,每次都储存到我们定义的item中”
foreach
的简单解释可以看书本P100
题目:将所有的
picture
的BackColor
设置为红色
这里我们在问题1的基础上使用一个判断来实现
foreach (Control item in this.Controls)
{
if (item is PictureBox)
item.BackColor = System.Drawing.Color.Red;
}
解释:
加了一个判断,当 item
为 pictureBox
时执行了改变颜色的语句
int i = 0;
foreach (Control item in this.Controls)
{
if (item is Button)
item.Text = i.ToString();
i++;
}
这段代码看似没有问题,如果你按照上面的做法做了,可能能得到想要的结果,也可能不行,主要取决与你的 button
控件的创建顺序,在我这里就是这样的
button
直接从11开始了,主要是因为我的 button
是最后创建的,前面 pictureBox
和 label
刚好11个,从0开始,所以 button
就只能从11开始了
这个问题其实很好解决,改进如下
int i = 0;
foreach (Control item in this.Controls)
{
if (item is Button)
{
item.Text = i.ToString();
i++;
}
}
将 i
放到确定是 button
的时候再自增就可以了
题目:用数组实现将将所有的
button
的Text
属性改为ArrayChange
面向对象设计里面的数组可强大了,这种方式既有利于一开始的批量操作,也很方便后面的针对个别元素的操作,取下标操作就可以了
Button[] buttonarray;
buttonarray = new Button[] {button1, button2, button3, button4, button5,
button6, button7, button8, button9, button10};
for (int n = 0; i < buttonarray.Length; i++)
buttonarray[n].Text = "arrayChange";
解释:
我们之前接触过的是 int[]
或者 string[]
类型的数组,万万没想到 Button[]
也可以做数组,其实我们之前接触过 Label[]
数组,那个特卡机的“触边分裂”的项目里就有。关于为什么控件也能做数组呢?,这里就要了解C#的数据类型了
C#语言的数据类型按内置和自定义划分,有内置类型和构造类型。内置类型是C#提供、无法再分解的一种具体类型。构造类型是在内置类型基础上构造出来的类型。——书本P53
内置类型包括 int
, string
等类型,构造类型既然是在内置类型的基础上构造的,那内置类型能做的事,构造类型应该也是可以的咯
控件属于类,类属于构造类型,那 Button[]
也就没有那么奇怪了(这里的解释其实不能算是解释,只是一个推理,具体的原理还不是很清楚)
当然, if
循环可以用 foreach
取代
foreach (Button mybutton in buttonarray)
mybutton.Text = "arrayChange";
这里就要注意了,不能使用下面的方式
foreach (Button[] mybutton in buttonarray)
mybutton.Text = "arrayChange";
会提示两个错误
这里是没有理解好 foreach
后面括号里的内容导致的 ,括号后面的内容理解为 (数据类型 自定义名字 in 集合)
,我们需要改的是 button
的属性,但是我们现在找的是 Button[]
,这里面的数据类型就不一样了。
当然
下面的这几种也是错的,不过错的地方不一样,这是因为后面的集合使用了类型的原因
foreach (Button mybutton in Button)
mybutton.Text = "arrayChange";
解释:
button
是类型不是集合,数组可以是一个集合,this.Controls也是一个集合,表示当前窗体的所有控件
使用拖控件创建多个控件的方式还是太麻烦,在代码里是可以实现的,之前我们也接触过,还是那个触边分裂的项目,我还没有研究透,迟点再总结。