我们知道,委托和事件是C#/.NET开发,特别是WINFORM开发中非常重要的知识。
作为C#/.NET的新手或者是对C#委托和事件还不是很熟悉的同学来说,就更应该了解和学会怎么在开发过程中来使用委托和事件了。熟练掌握了委托和事件会让你在项目事半功倍,得心应手。
比如下面我就来举个栗子说明一下委托和事件在实例中的使用,即本文标题所描述的—C#/.NET WINFORM中使用委托和事件在类中更新窗体UI控件。
这个例子的原型很简单,就是一个单独的计算器类(Calculator),此类中有计算的Sum方法,有保存计算结果的Result属性。当我们在使用了Sum计算方法进行计算时,如果计算结果发生变化,我们需要把更新到窗体UI的显示计算结果的控件上去。
那么,这个例子在实现的过程中,就使用到了委托和事件处理。以下贴出实例核心代码。计算器类(Calculator):
namespace UpdateUiFromClass
{
//声明一个计算器类
public class Calculator
{
/// <summary>
/// 声明一个监控结果变化的委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void ResultChangedHandler(object sender, object e);
/// <summary>
/// 声明一个监控结果变化的事件
/// </summary>
public event ResultChangedHandler OnResultChanged;
private int _result;
/// <summary>
/// 计算器的计算结果
/// </summary>
public int Result
{
get { return _result; }
}
//处理注册的事件
protected virtual void RaiseResultChanged(object sender, object e)
{
var handler = OnResultChanged;
//判断是否注册了OnResultChanged事件,只有注册了OnResultChanged事件才执行事件对应的方法
if (handler != null) handler(sender, e);
}
/// <summary>
/// 加法操作
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
public void Sum(int a, int b)
{
var temp = a + b;
if (_result == temp) return;
_result = temp;
RaiseResultChanged(this, _result);
}
}
}
窗体类(FrmMain)
using System;
using System.Windows.Forms;
namespace UpdateUiFromClass
{
public partial class FrmMain : Form
{
/// <summary>
/// 私有的计算器变量
/// </summary>
private Calculator _calc;
public FrmMain()
{
InitializeComponent();
}
private void btnOperate_Click(object sender, EventArgs e)
{
if (_calc == null)
{
//实例化一个计算器
_calc = new Calculator();
//注册计算结果变化时要触发的事件
_calc.OnResultChanged += calc_OnResultChanged;
}
int a, b;
if (int.TryParse(txtAddend.Text, out a) && int.TryParse(txtAugend.Text, out b))
{
_calc.Sum(a,b);
}
}
/// <summary>
/// 计算结果变化时触发事件的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void calc_OnResultChanged(object sender, object e)
{
//此行用的是Calculator类中的Result属性值
//txtResult.Text = _calc.Result.ToString();
//此行用的是Calculator类中委托参数传入的值
txtResult.Text = e.ToString();
/*
*
* 以下是对sender参数的操作
* 你可以把注释取消来查看执行结果
*
*
//此行是获取被实例化后的Calculator类中委托传入的第一个参数,即sender
var calc = (Calculator) sender;
//获取到sender后,我们就可以对它进行相关的操作了,这里的sender就是上面声明的_calc实例
MessageBox.Show(calc.Result.ToString());
*
*/
}
}
}
运行效果如图:
在示例中,我作了比较详细的注释了,相信看懂应该是不成问题的。如果需要本例的源码,请点击这里下载
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册