您的位置:首页 > 其它

委托示例(1)

2013-11-24 21:12 239 查看
可以把委托视为“方法”的类型,这样就可以把方法作为参数来传递了。什么时候需要使用委托?下面来例举一个例子说明。

假设我们需要对许多文本框设置属性:



比如我们要设置前景色、背景色,普通的编码会是这样的:

设置前景色:

if (colorDialog.ShowDialog() == DialogResult.OK)
{
foreach (Control temp in FlpControls.Controls)
{
temp.ForeColor = colorDialog.Color;
}
}


设置背景色

if (colorDialog.ShowDialog() == DialogResult.OK)
{
foreach (Control temp in FlpControls.Controls)
{
temp.BackColor = colorDialog.Color;
}
}


发现什么问题没有,大体的逻辑都是一样的,都是使用了foreach循环,就是foreach循环里面的代码不一样。那么能不能想个办法,把foreach循环通用?

下面我们定义一个委托:

/// <summary>
/// 设置控件颜色属性相关的委托
/// </summary>
/// <param name="ctl">控件</param>
/// <param name="property">颜色</param>
public delegate void DelegateSetControlColor(Control ctl,Color property);


然后定义一个设置与颜色相关的通用方法

/// <summary>
/// 设置控件属性
/// </summary>
/// <param name="flp">存放文本框控件的控件</param>
/// <param name="setColor">定义控件颜色的相关委托</param>
/// <param name="propervalue">相关的颜色</param>
public static void SetProperties(FlowLayoutPanel flp, DelegateSetControlColor setColor, Color propervalue)
{
foreach (Control temp in flp.Controls)
{
setColor(temp, propervalue);
}
}


注意:参数setColor是一个方法。这样foreach循环就通用了,那具体该这么用呢?

设置前景色

if (colorDialog.ShowDialog() == DialogResult.OK)
{
//SetControlForeColor是设置前景色的具体方法
SetControlProperties.SetProperties(FlpControls, SetControlForeColor, colorDialog.Color);
}


设置背景色

if (colorDialog.ShowDialog() == DialogResult.OK)
{
//SetControlBackColor是设置背景色的具体方法
SetControlProperties.SetProperties(FlpControls, SetControlBackColor, colorDialog.Color);
}


而具体设置前景色和背景色的方法是这样的:

#region 设置与控件颜色相关的具体方法
/// <summary>
/// 设置背景色
/// </summary>
/// <param name="ctl">控件</param>
/// <param name="color">背景色</param>
public static void SetControlBackColor(Control ctl, Color color)
{
ctl.BackColor = color;
}
/// <summary>
/// 设置前景色
/// </summary>
/// <param name="ctl">控件</param>
/// <param name="color">前景色</param>
public static void SetControlForeColor(Control ctl, Color color)
{
ctl.ForeColor = color;
}
#endregion


这样用了委托有以下好处:

1 通用了同样的逻辑块foreach循环;

2 由于具体方法从具体的逻辑块中剥离了,是独立的方法,一样可以重复使用。

同样,我们可以把属性为int类型,枚举类型的方法用委托抽象出来,试一下吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: