学习:利用数组或foreach批量修改

说明:

在课程设计中使用到了这种方法,能够提高效率和减少代码量。

问题来源:

有时候WinForm程序中会出现很多同类的控件,例如下图,就有10个 button ,5个 label , 6个 pictureBox
学习:利用数组或foreach批量修改_第1张图片

问题如下:
1. 将所有的 buttonlabelText 属性改为 Here
2. 将所有的 pictureBackColor 设置为红色
3. 将 buttonText 显示改为从0到9顺序
4. 用数组实现将将所有的 buttonText 属性改为 ArrayChange

标题算是给了提示,可以先试一试自己解决一下上面的问题。

解决方案:

  • 问题1

题目:将所有的 buttonlabelText 属性改为 Here
在这里为了学习到 Control 控件,将 pictureBox 也变了吧

foreach (Control item in this.Controls)
                item.Text = "Here";

解释:
foreach 后面括号里的 Control 是指 控件 , item 是自定义的名字, this.Controls 是指当前窗体(this)的所有控件(Controls)
结合起来的意思就是 “遍历当前窗体的所有控件,每次都储存到我们定义的item中”

foreach 的简单解释可以看书本P100


  • 问题2

题目:将所有的 pictureBackColor 设置为红色
这里我们在问题1的基础上使用一个判断来实现

foreach (Control item in this.Controls)
            {
                if (item is PictureBox)
                    item.BackColor = System.Drawing.Color.Red;
            }

解释:
加了一个判断,当 itempictureBox 时执行了改变颜色的语句


  • 问题3:

题目:将 buttonText 显示改为从0到9顺序
要实现的效果图:(看右下角 button
学习:利用数组或foreach批量修改_第2张图片

int i = 0;
foreach (Control item in this.Controls)
{
    if (item is Button)
        item.Text = i.ToString();

    i++;
}

这段代码看似没有问题,如果你按照上面的做法做了,可能能得到想要的结果,也可能不行,主要取决与你的 button 控件的创建顺序,在我这里就是这样的
学习:利用数组或foreach批量修改_第3张图片
button 直接从11开始了,主要是因为我的 button 是最后创建的,前面 pictureBoxlabel 刚好11个,从0开始,所以 button 就只能从11开始了
这个问题其实很好解决,改进如下

int i = 0;
foreach (Control item in this.Controls)
{
    if (item is Button)
    {
        item.Text = i.ToString();
        i++;
    }
}

i 放到确定是 button 的时候再自增就可以了



  • 问题4:

题目:用数组实现将将所有的 buttonText 属性改为 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也是一个集合,表示当前窗体的所有控件

后记:

使用拖控件创建多个控件的方式还是太麻烦,在代码里是可以实现的,之前我们也接触过,还是那个触边分裂的项目,我还没有研究透,迟点再总结。

你可能感兴趣的:(C#)