net的事件

类或对象可以通过事件向其他类或对象通知发生的相关事情。 引发事件的类称为“发行者”,接收事件的类称为“订阅者”。
下面实现新增一个会员时,通知AddPatientHandler类处理新增会员事件。

.Net Framework的事件编码规范
    委托类型的名称都应该以EventHandler结束。
    委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
    事件的命名为 委托去掉 EventHandler之后剩余的部分。
    继承自EventArgs的类型应该以EventArgs结尾。

第一步:发布符合 .NET Framework 准则的事件
1.1 定义与事件一起发送自定义数据
    public class PatientEventArg : EventArgs
    {
        public int PatientId { get; set; }
        public string PatientName { get; set; }
    }

1.2  在发布类中声明事件
     public event EventHandler<PatientEventArg> AddPatientEvent;

1.3  在发布类引发事件

使用受保护的虚方法来引发每个事件。 这只适用于未密封类的非静态事件,而不适用于结构、密封类或静态事件。

遵循此准则可使派生类能够通过重写受保护的方法来处理基类事件。 受保护的 virtual方法的名称应该是为事件名加上 On 前缀而得到的名称。
 例如,名为“TimeChanged”的事件的受保护的虚方法被命名为“OnTimeChanged”。

        protected virtual void OnAddPatient(PatientEventArg e)
        {
            if (AddPatientEvent != null)
                AddPatientEvent(this, e);
        }

1.4 在发布类中提供对外的接口,间接引发事件

        public void AddPatient(PatientInfo patient)
        {
            OnAddPatient(new PatientEventArg { PatientId = patient.PatientID, PatientName = patient.PatientName });
        }

第二步: 在接收事件的类定义处理事件
    public class AddPatientHandler
    {
        public void AddPatient(object sender, PatientEventArg e)
        {
            Console.WriteLine("新增一个会员:" + e.PatientName);
            Console.ReadLine();
        }
    }

第三步:订阅事件
    public partial class _Default : System.Web.UI.Page
    {
        PatientInfo patient = new PatientInfo();
        protected void Page_Load(object sender, EventArgs e)
        {
            patient.AddPatientEvent += new AddPatientHandler().AddPatient;
        }

        protected void btaAddPatient_Click(object sender, EventArgs e)
        {
            patient.AddPatient(new PatientInfo { PatientName = "liu", PatientID = 1 });
        }
    }

posted @ 2012-03-05 16:52  虎头  阅读(229)  评论(0编辑  收藏  举报