给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
2008-07-03 19:34
671 查看
写自定义控件已经好久了,也有几个用得时间比较长的,但是对于“事件”一直是比较模糊,没有很详细的理解。
最近升级分页控件,由于原来使用的是VB.net(在VB.net里面添加一个事件是比较容易的),现在想改用C#,而原来的方法又写得比较笨拙,想换一个更简洁一点的方法,所以不得不重新认识一下事件。看了几遍《道不远人深入解析asp.net2.0控件开发》居然没有看懂,可能是自己太笨了吧。又找到了自定义分页控件开发 看了几遍,还是比较迷糊,最后把《自定义分页控件开发》 里提供的代码down下来看了一下,终于有点明白了。
先举一个简单的例子吧,我们建立一个复合控件,在CreateChildControls()里面添加两个控件,一个是Label,一个是LinkButton。我们的目的是要给自定义控件加一个事件,以便可以控制Label的Text属性。
1、内部事件。
这个好像是我起的名称,就是只在自定义控件的内部相应的事件,使用控件的页面不用相应相关的事件。具体一点就是要在自定义控件内部,在单击LinkButton的时候修改Label的值。
public class EventTest : WebControl, INamingContainer
编写好这段代码,然后把控件拖拽到页面里面里进行测试,运行后点击LinkButton,我们可以看到页面已经提交了,但是什么变化也没有,恩,我们还没有些事件呢。现在我们就给LinkButton加一个Click的事件。
protected override void CreateChildControls()
void btn_Click(object sender, EventArgs e)
再次运行网页,单击,我们看到了想要的效果。
怎么样简单吧,但是这种方法很不灵活,如果调用控件的网页也想相应事件怎么办呢?
2、外部事件。
这回我们要让自定义控件的外部也能相应事件。这个理论上我们要使用委托,也就是delegate,但是系统已经为我们定义好了一个(EventHandler),我们先用现成的。
这样我们就给自定义控件定义了一个事件,重新编译,我们可以在控件的属性里面看到这个事件。(如果您没有看到,说明没有刷新,可能需要把IDE关闭,再次打开)。
public event EventHandler myClick
我们可以添加外部的响应事件了,双击,我们加上几行代码。
在使用控件的网页里填写的代码
protected void EventTest1_myClick(object sender, EventArgs e)
运行,奇怪还是原来的样子,外部事件并没有相应,不是加了一个事件吗?外面的事件怎么没有被调用呢?这是因为,事件先触发自定义控件内部的事件,然后再由控件内部发出“命令”,调用外部的事件,那么我们怎样才能发出这个命令呢?我们需要要添加这个函数。这个也是最让我费解的地方,可能是对委托不是很了解的原因吧。
protected void TestClick(object sender,EventArgs e)
在修改一下 btn_Click() 就可以了。
void btn_Click(object sender, EventArgs e)
protected override void CreateChildControls()
运行OK。然后我们修改一下:__doPostBack的第二个参数,
<a id=\"aa\" href=\"javascript:__doPostBack('EventTest1$btn','1')\">aa</a>")
奇怪,再次运行的时候出现了异常,看来不让这么做呀。
依赖别人是不行了,必须要实现自定义控件自己的事件了。我们请来 IPostBackEventHandler 帮忙。同时<a>的href修改成
this.Controls.Add(new LiteralControl("<BR><a id=\"a1\" href=\"javascript:__doPostBack('"+ this.ClientID +"','1')\">[1]</a>"));
this.Controls.Add(new LiteralControl(" <a id=\"a2\" href=\"javascript:__doPostBack('" + this.ClientID + "','2')\">[2]</a>"));
this.Controls.Add(new LiteralControl(" <a id=\"a3\" href=\"javascript:__doPostBack('" + this.ClientID + "','3')\">[3]</a>"));
this.Controls.Add(new LiteralControl(" <a id=\"a4\" href=\"javascript:__doPostBack('" + this.ClientID + "','4')\">[4]</a>"));
在实现 RaisePostBackEvent 函数
public void RaisePostBackEvent(string Index)
再次运行,OK。同时我们也得到了<a>传递过来的数字(页号)。
var theForm = document.forms['form1'];
namespace JYK.Controls.Page
最近升级分页控件,由于原来使用的是VB.net(在VB.net里面添加一个事件是比较容易的),现在想改用C#,而原来的方法又写得比较笨拙,想换一个更简洁一点的方法,所以不得不重新认识一下事件。看了几遍《道不远人深入解析asp.net2.0控件开发》居然没有看懂,可能是自己太笨了吧。又找到了自定义分页控件开发 看了几遍,还是比较迷糊,最后把《自定义分页控件开发》 里提供的代码down下来看了一下,终于有点明白了。
先举一个简单的例子吧,我们建立一个复合控件,在CreateChildControls()里面添加两个控件,一个是Label,一个是LinkButton。我们的目的是要给自定义控件加一个事件,以便可以控制Label的Text属性。
1、内部事件。
这个好像是我起的名称,就是只在自定义控件的内部相应的事件,使用控件的页面不用相应相关的事件。具体一点就是要在自定义控件内部,在单击LinkButton的时候修改Label的值。
public class EventTest : WebControl, INamingContainer
编写好这段代码,然后把控件拖拽到页面里面里进行测试,运行后点击LinkButton,我们可以看到页面已经提交了,但是什么变化也没有,恩,我们还没有些事件呢。现在我们就给LinkButton加一个Click的事件。
protected override void CreateChildControls()
void btn_Click(object sender, EventArgs e)
再次运行网页,单击,我们看到了想要的效果。
怎么样简单吧,但是这种方法很不灵活,如果调用控件的网页也想相应事件怎么办呢?
2、外部事件。
这回我们要让自定义控件的外部也能相应事件。这个理论上我们要使用委托,也就是delegate,但是系统已经为我们定义好了一个(EventHandler),我们先用现成的。
这样我们就给自定义控件定义了一个事件,重新编译,我们可以在控件的属性里面看到这个事件。(如果您没有看到,说明没有刷新,可能需要把IDE关闭,再次打开)。
public event EventHandler myClick
我们可以添加外部的响应事件了,双击,我们加上几行代码。
在使用控件的网页里填写的代码
protected void EventTest1_myClick(object sender, EventArgs e)
运行,奇怪还是原来的样子,外部事件并没有相应,不是加了一个事件吗?外面的事件怎么没有被调用呢?这是因为,事件先触发自定义控件内部的事件,然后再由控件内部发出“命令”,调用外部的事件,那么我们怎样才能发出这个命令呢?我们需要要添加这个函数。这个也是最让我费解的地方,可能是对委托不是很了解的原因吧。
protected void TestClick(object sender,EventArgs e)
在修改一下 btn_Click() 就可以了。
void btn_Click(object sender, EventArgs e)
protected override void CreateChildControls()
运行OK。然后我们修改一下:__doPostBack的第二个参数,
<a id=\"aa\" href=\"javascript:__doPostBack('EventTest1$btn','1')\">aa</a>")
奇怪,再次运行的时候出现了异常,看来不让这么做呀。
依赖别人是不行了,必须要实现自定义控件自己的事件了。我们请来 IPostBackEventHandler 帮忙。同时<a>的href修改成
this.Controls.Add(new LiteralControl("<BR><a id=\"a1\" href=\"javascript:__doPostBack('"+ this.ClientID +"','1')\">[1]</a>"));
this.Controls.Add(new LiteralControl(" <a id=\"a2\" href=\"javascript:__doPostBack('" + this.ClientID + "','2')\">[2]</a>"));
this.Controls.Add(new LiteralControl(" <a id=\"a3\" href=\"javascript:__doPostBack('" + this.ClientID + "','3')\">[3]</a>"));
this.Controls.Add(new LiteralControl(" <a id=\"a4\" href=\"javascript:__doPostBack('" + this.ClientID + "','4')\">[4]</a>"));
在实现 RaisePostBackEvent 函数
public void RaisePostBackEvent(string Index)
再次运行,OK。同时我们也得到了<a>传递过来的数字(页号)。
var theForm = document.forms['form1'];
namespace JYK.Controls.Page
相关文章推荐
- 给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
- 给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
- 给自定义控件(Web Control)添加事件的几种方法
- 【更正】“给自定义控件(Web Control)添加事件的几种方法”有一个不太准确的地方。
- 【更正】“给自定义控件(Web Control)添加事件的几种方法”有一个不太准确的地方。
- 自定义控件(12)回传事件IPostBackEventHandler
- input文本框没有onchange事件,可以通过下面两种方法实现当input内容改变时触发事件
- asp.net2.0服务器控件捕获回传事件IPostBackEventHandler
- 客户端回传事件接口IPostBackEventHandler
- input文本框没有onchange事件,可以通过下面两种方法实现当input内容改变时触发事件
- page在处理post请求时需要处理数据的加载IPostBackDataHandler和事件的触发IPostBackEventHandler.
- 蚁群算法,PSO算法以及两种算法可以融合的几种方法
- Android编程使用WebView实现文件下载功能的两种方法
- ASP自定义控件的两种实现方法
- 两种web免登录自动化测试实现方法及比较
- Android按返回键(后退键)Back键事件捕获的两种方法
- Js事件详解(1)事件类型及几种添加事件处理程序的方法
- RecyclerView 添加点击事件的几种方法
- 为服务器控件添加javascript客户端事件(WebControl的Attributes属性)
- IPostBackEventHandler 與 IPostBackDataHandler