下面的示例展示如果为用户控件中的RadioButtonList控件开放自定义事件。
public partial class SDGroupPanel : System.Web.UI.UserControl
{
//先在用户控件中定义一个RadioButtonList控件
private RadioButtonList sortRadioList = new RadioButtonList();
//然后声明一个事件,开放给使用者
private object sortObject = new object();
/// <summary >
/// 自定义排序事件
/// </summary >
public event EventHandler SortEventHander
{
add { base.Events.AddHandler(sortObject, value); }
remove { base.Events.RemoveHandler(sortObject, value); }
}
然后在用户控件的CreateChildControls事件中将RadioButtonList控件添加到用户控件中。
protected override void CreateChildControls()
{
sortRadioList.ID = "sort_radiolist";
sortRadioList.Items.Add(new ListItem("降序", "0"));
sortRadioList.Items.Add(new ListItem("升序", "1"));
sortRadioList.RepeatDirection =RepeatDirection.Horizontal;
sortRadioList.RepeatLayout = RepeatLayout.Flow;
sortRadioList.AutoPostBack = true;
if (base.Events[sortObject] != null)
{
EventHandler ev = base.Events[sortObject] as EventHandler;
this.sortRadioList.SelectedIndexChanged += ev;
}
this.Controls.Add(sortRadioList);
}
}
上面代码中的加粗代码为重点,我们先判断使用者有没有给SortEventHander赋值,如果有,则将该事件添加到sortRadioList的SelectedIndexChanged事件集中。
注意自定义排序事件处:我们也可以用public event EventHandler SortEventHander来简单的定义事件,但我们知道,任何事件的创建都是需要消耗一定资源,而在复杂的富控件中,往往会定义大量的事件开放给使用者,如果都是这样简单的来定义,那么就会耗用大理系统资源,尽管这些事件使用者都没有使用到,而通过
base.Events.AddHandler来添加事件,就是将事件的创建与耗毁都交给Events事件来处理,也就是只有在事件被使用的时候才会被创建。
重要:
如果想用户在点击sortRadioList的选择项时触发SortEventHander事件,那么我们一定要在调用页面的Page_Load事件真正结束前,将SortEventHander事件添加到sortRadioList的SelectedIndexChanged事件的委托链中。这样,调用页定义的SortEventHander事件才会触发。所以我们选择在CreateChildControls事件中将SortEventHander事件添加到sortRadioList的SelectedIndexChanged事件的委托链中,因为CreateChildControls事件会在Page_Load事件之前发生。
调用页的使用代码:
在调用页的OnInit事件中,将用户自定义的GroupPanel_SortEventHander事件通过委托添加到SingleMaster.GroupPanel.SortEventHander事件中。
protected override void OnInit(EventArgs e)
{
SingleMaster.GroupPanel.SortEventHander += new EventHandler(GroupPanel_SortEventHander);
}
/// <summary >
/// 点击排序按钮后事件
/// </summary >
/// <param name="sender" ></param >
/// <param name="e" ></param >
protected virtual void GroupPanel_SortEventHander(object sender, EventArgs e)
{
}
本章仅是讲解了如何在
asp.net用户控件中实现自定义事件的解题思路,供新手参考。