委托和事件

委托:

    //一、委托:
    //委托实际上是一个能够持有对某个方法引用的类。实现一个委托的过程大致如下:
    //(1).声明一个delegate对象,它与你想要传递的方法具有相同参数和返回值类型。
    //(2).定义一个delegate对象,并将你想要传递的方法作为参数传入。
    //(3).通过上一步创建的delegate对象来调用方法。

    class Program
    {
        //声明一个委托,可以执行具有两个整形参数,并且返回值为整形的方法
        public delegate int ComputeDelegate(int a, int b);

        public static int Add(int a, int b)
        {
            return a + b;
        }

        public static int Substract(int a, int b)
        {
            return a - b;
        }

        static void Main(string[] args)
        {
            //创建委托对象
            ComputeDelegate compute = new ComputeDelegate(Add);
            Console.WriteLine(compute(200, 100));
            compute = new ComputeDelegate(Substract);
            Console.WriteLine(compute(200, 100));
            Console.ReadKey();
        }
    }


事件:

    //二、事件:
    //C#中的事件处理实际上是一种具有特殊签名的delegate,完成事件的步奏如下:
    //(1).定义delegate对象类型,它有两个参数:第一个参数是事件发送者对象;第二个参数是事件参数类对象。
    //(2).定义事件参数类,此类应当从System.EventArgs类派生。如果事件不带参数,这一步可以省略。
    //(3).定义事件处理方法,它应当与delegate对象具有相同参数和返回值类型。
    //(4).用event关键字定义事件对象,它同时也是一个delegate对象。
    //(5).用 += 操作符添加事件到事件队列中( -= 操作符能够将事件从队列中删除)。
    //(6).在需要触发事件的地方调用delegate的方式实现事件触发。
    //(7).在适当的地方调用事件触发方法。

    public class Program
    {
        //定义delegate对象
        public delegate void SampleEvent(object sender, System.EventArgs e);

        //用event关键字定义事件对象
        private event SampleEvent sampleEvent;

        public Program()
        { 
            //步奏5.用+=操作符将事件添加到队列中
            this.sampleEvent += new SampleEvent(Program_sampleEvent);
        }

        void Program_sampleEvent(object sender, EventArgs e)
        {
            Console.WriteLine("事件已经执行!");
        }

        //步奏6.调用委托方法
        public void RaiseEvent()
        {
            EventArgs e = new EventArgs();
            
            if (sampleEvent!=null)
            {
                sampleEvent(
                            this,   //事件发送者对象
                            e       //事件参数类对象
                            );
            }
        }

        static void Main(string[] args)
        {
            Program et = new Program();
            et.RaiseEvent();
            Console.ReadKey();
        }
    }


自定义事件参数类:

自定义事件参数类必须继承EventArgs类,使用方法如下:

/// <summary>
///自定义事件参数类
/// </summary>
public class SearchEventArgs:EventArgs
{
    /// <summary>
    /// 价格最小值
    /// </summary>
    public string PriceFrom { get; set; }

    /// <summary>
    /// 价格最大值
    /// </summary>
    public string PriceTo { get; set; }

    /// <summary>
    /// 书名
    /// </summary>
    public string BookName { get; set; }

    /// <summary>
    /// 出版社
    /// </summary>
    public string Publisher { get; set; }

    /// <summary>
    /// 图书图片编号
    /// </summary>
    public string ISBN { get; set; }

    /// <summary>
    /// 出版日期最小值
    /// </summary>
    public string BeginDate { get; set; }

    /// <summary>
    /// 出版日期最大值
    /// </summary>
    public string EndDate { get; set; }


    public SearchEventArgs(string bookName, string publisher, string isbn, string beginDate, string endDate, string priceFrom, string priceTo)
    {
        this.BookName = bookName;
        this.Publisher = publisher;
        this.ISBN = isbn;
        this.BeginDate = beginDate;
        this.EndDate = endDate;
        this.PriceFrom = priceFrom;
        this.PriceTo = priceTo;
    }

}

使用自定义参数类和事件访问器:

    //委托
    public delegate void SearchEventHandler(object sender, SearchEventArgs e);

    private static object keySearched = new object();//键名

    //事件访问器
    public event SearchEventHandler Searched
    {
        add 
        {
            base.Events.AddHandler(keySearched, value);
        }
        remove
        {
            base.Events.RemoveHandler(keySearched, value);
        }
    }

    protected void btnOK_Click(object sender, EventArgs e)
    {
        //调用委托方法
        SearchEventHandler handler = (SearchEventHandler)base.Events[keySearched];

        SearchEventArgs el = new SearchEventArgs(this.txtBookName.Text.Trim(),
                                                 this.txtPublisher.Text.Trim(),
                                                 this.txtISBN.Text.Trim(),
                                                 this.txtDateFrom.Value.Trim(),
                                                 this.txtDateTo.Value.Trim(),
                                                 this.txtPriceFrom.Text.Trim(),
                                                 this.txtPriceTo.Text.Trim());
        if (handler!=null)
        {
            handler(this, el);
        }
    }

调用事件:

    this.SearchControl1.Searched += new UserControls_SearchControl.SearchEventHandler(SearchControl1_Searched);

    void SearchControl1_Searched(object sender, SearchEventArgs e)
    {
        
    }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值