比如说有一个GroupBox
。
其中放有多个单选按钮RadioButton
,它们都是用来进行一类操作,比如修改字体。
最简单的想法是每个单选按钮都写一个CheckedChanged
事件,但是,当我们增加了字体选项时,得再加一个相应的方法,因此代码不是封闭的。
代码封闭:
个人理解:不让每次新增功能时都新增一次与原先写过的相同或相似功能重复的代码,应实现代码的复用性。
此时就可以使用GroupBox.Controls
获得其中的左右控件,但后统一操作即可。
private void ModifyFont()
{
foreach(var ctr in groupBox.Controls)
{
//如果控件是单选按钮且按钮被选中
if(ctr is RadioButton && (ctr as RadioButoon).Checked)
{
//修改某控件的字体
XXX控件.Font = new Font((ctr as RadioButoon).Text, 12);//字体类型,字号
//一次只有一个被选中,找到就退出循环
break;
}
}
}
接下来可以在原来的方法中都调用ModifyFont()
方法,这样代码依然不封闭。
解决办法:
在窗体加载时,为单选按钮加上CheckedChange
事件(是一个委托),并传入ModifyFont()
方法,但ModifyFont()
的签名得改一下。
//ModifyFont方法得有与RadioButton.CheckedChange()一样的签名(参数返回值要一样)
private void ModifyFont(object sender, EventArgs e)
{
foreach(var ctr in groupBox.Controls)
{
//如果控件是单选按钮且按钮被选中
if(ctr is RadioButton && (ctr as RadioButoon).Checked)
{
//修改某控件的字体
XXX控件.Font = new Font((ctr as RadioButoon).Text, 12);//字体类型,字号
//一次只有一个被选中,找到就退出循环
break;
}
}
}
private void Formx_Load(object sender, EventArgs e)
{
foreach(var ctr in groupBox.Controls)
{
//如果控件是单选按钮
if(ctr is RadioButton)
{
//添加CheckedChange事件,签名一致,委托可以赋值
(ctr as RadioButoon).CheckedChange += ModifyFont;
}
}
}
这样就可以将最初的那些单独的方法删除了。