委托:
//一、委托:
//委托实际上是一个能够持有对某个方法引用的类。实现一个委托的过程大致如下:
//(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)
{
}