ASP.NET自定义控件事件响应

本文介绍ASP.NET中控件的不同事件处理方式,包括事件冒泡、直接响应内部控件事件、利用客户端JavaScript来回发及TextBox响应onKeyDown事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.重载protected override bool OnBubbleEvent(object source, EventArgs args)
OnBubbleEvent是控件内包含的控件向外层控件作事件冒泡
-------------------------------------------------------------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.ComponentModel;

public class uc_DanXuan : CompositeControl
{
private Button btnSave = null;
public EventHandler SaveAnswer; //定义这个是为了在控件外进行事件响应处理

protected override void CreateChildControls()
{
Controls.Clear();
btnSave = new Button();
btnSave.Text = "Click Me";
btnSave.CommandName = "事件的名字随便取"; //这是事件发生时,事件的名字,区分事件用
btnSave.CommandArgument = "事件的参数,看需要"; //这是事件发生后,用来传参数的,可以没有
Controls.Add(btnSave);
}

protected override bool OnBubbleEvent(object source, EventArgs args)
{
if (args is CommandEventArgs)
{
CommandEventArgs cmdArgs = args as CommandEventArgs;
//可以在这里加些代码,在控件内先处理一下
if(SaveAnswer != null) //如果要在外面处理,就到事件处理程序中去
SaveAnswer(source, args);
return true;
}
else
{
return base.OnBubbleEvent(source, args);
}

}
}
--------------------------------------------------------------------------------------------------------------------------------------

测试它:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
uc_DanXuan ucdx = new uc_DanXuan();
ucdx.SaveAnswer += new EventHandler(SaveAnswer); //要在外面处理事件
form1.Controls.Add(ucdx);

}
public void SaveAnswer(object sender, EventArgs args) //这里具体处理
{

}
}
---------------------------------------------------------------------------------------------------------------------------------------------

2.直接响应内部控件的事件
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.ComponentModel;

public class uc_DanXuan : CompositeControl
{
private Button btnSave;
public event EventHandler SaveAnswer; //留给控件外部处理这个事件

protected virtual void OnSave(Object source, EventArgs e) //控件内部在这里处理这个事件
{
if (SaveAnswer != null)
{
SaveAnswer(this, e); //内部处理完了,再给外部处理
}
}

protected override void CreateChildControls()
{
Controls.Clear();
btnSave = new Button();
btnSave.ID = "btn";
btnSave.Text = "Save";
btnSave.Click += new EventHandler(OnSave); //响应按钮的click
this.Controls.Add(btnSave);
}

protected override void Render(HtmlTextWriter writer)
{
btnSave.RenderControl(writer);
}
}
测试代码同上

----------------------------------------------------------------------------------------------------------------------------------------
3.利用客户端javascript来回发?
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.ComponentModel;

public class uc_DanXuan : CompositeControl, IPostBackEventHandler
{
private Button btnSave;
public event EventHandler SaveAnswer; //留给控件外部处理这个事件

protected virtual void OnSave(EventArgs e) //控件内部在这里处理这个事件
{
if (SaveAnswer != null)
{
SaveAnswer(this, e); //内部处理完了,再给外部处理
}
}

protected override void CreateChildControls()
{
btnSave = new Button();
btnSave.ID = "btn";
btnSave.Text = "Save";

//实用客户端javascript来完成事件回发
btnSave.OnClientClick = Page.ClientScript.GetPostBackEventReference(this, "save");

}
public override void RenderControl(HtmlTextWriter writer)
{
btnSave.RenderControl(writer);
base.RenderControl(writer);
}

void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
{
if (eventArgument == "save")
OnSave(new EventArgs());
}
}
测试代码同上

4.让TextBox响应onKeyDown
----------------------------------------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.ComponentModel;

public class uc_DanXuan : CompositeControl, IPostBackEventHandler
{
private TextBox tbx;

public event EventHandler OnKeyDown;

protected override void CreateChildControls()
{
Controls.Clear();
tbx = new TextBox();
tbx.ID = "tbx";
tbx.Attributes.Add("onkeydown", Page.ClientScript.GetPostBackEventReference(this, "onKeyDown"));
Controls.Add(tbx);
}

public void RaisePostBackEvent(string eventArgument)
{
switch (eventArgument)
{
case "onKeyDown":
if (OnKeyDown != null)
OnKeyDown(this, EventArgs.Empty);
break;
}
}
}
测试代码:
protected void Page_Load(object sender, EventArgs e)
{
uc_DanXuan ucdx = new uc_DanXuan();
ucdx.OnKeyDown += new EventHandler(ucdx_OnKeyDown);
form1.Controls.Add(ucdx);

}

void ucdx_OnKeyDown(object sender, EventArgs e)
{

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值