千家信息网

ASP.NET控件开发基础之事件处理的示例分析

发表于:2024-09-23 作者:千家信息网编辑
千家信息网最后更新 2024年09月23日,小编给大家分享一下ASP.NET控件开发基础之事件处理的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!ASP.NET控件开发基础之事件处理一.回发事件和客户端回发下面来看一个
千家信息网最后更新 2024年09月23日ASP.NET控件开发基础之事件处理的示例分析

小编给大家分享一下ASP.NET控件开发基础之事件处理的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

ASP.NET控件开发基础之事件处理一.回发事件和客户端回发

下面来看一个最简单的例子

按钮单击事件

protected void Button1_Click(object sender, EventArgs e)      {          Label1.Text = "你好: "+TextBox1.Text;      }

大家知道Web 服务器控件创建的按钮的类型有三种

1.Button

2.LinkButton

3.ImageButton

打开MSDN看到三个控件都继承IPostBackEventHandler接口

IPostBackEventHandler接口专门定义了处理回发事件的方法,说白了就是onclick事件,如果自定义控件需要处理回发事件,你就需要继承IPostBackEventHandler接口,然后实现接口的RaisePostBackEvent 方法,另外一个简单的方法就是直接继承Button控件就可以了.

RaisePostBackEvent方法用于处理窗体发送给服务器时引发的事件,方法中有一个参数eventArgument 表示要传递到事件处理程序的可选事件参数的 String

下面总结处理回发事件,必须要做的步骤

(1)继承并实现IPostBackEventHandler接口的RaisePostBackEvent方法

(2)为表单元素定义UniqueID,以与IPostBackEventHandler服务器控件的UniqueID相对应

相应实现代码如下

示例一

namespace CustomControls  {      public class SuperButton1 : Control, IPostBackEventHandler      {          // 声明Click事件委托          public event EventHandler Click;           // 定义OnClick事件处理程序          protected virtual void OnClick(EventArgs e)          {              if (Click != null)              {                  Click(this, e);              }          }           // 实现RaisePostBackEvent方法,处理回发事件          public void RaisePostBackEvent(string eventArgument)          {              OnClick(EventArgs.Empty);          }           protected override void Render(HtmlTextWriter output)          {              output.Write("﹤INPUT TYPE=submit name=" + this.UniqueID +                 " Value='确定' /﹥");          }      }  }

如果你不熟悉委托的话,可以参考一篇叫一个C#睡前故事的文章

EventArgs.Empty表示没有事件数据的事件,不要跟我以前一样认为是一个空的事件,当时就很郁闷,干什么要触发空事件呢,都是因为没看清楚Empty字段的意思,以为就为空的意思了.

EventArgs.Empty等同于EventArgs类的构造函数,等同于new EventArgs()

注意还在呈现控件的name属性加了UniqueID.

好了,现在你可以测试下了.

protected void SuperButton1_1_Click(object sender, EventArgs e)      {          Label1.Text = "你点击了此按钮";      }

这样你就成功定义了一个处理回发事件的控件. 假设你在页面上多次使用这个控件,编译器将为每个事件委托实例生成一个字段。如果事件的数目很大,则一个委托一个字段的存储成本可能无法接受。.所以推荐采用另外一种优化的事件实现

EventHandlerList 类提供一个简单的委托列表来添加和删除委托,下面来看看更改后的代码,

AddHandler有两个参数事件对象和添加的委托,在OnClick事件中必须显示将委托转换为EventHandler类型

示例二

using System;  using System.Web.UI;   namespace CustomComponents  {      public class SuperButton2 : Control, IPostBackEventHandler      {          // 声明Click事件委托          private static readonly object ClickKey = new object();           public event EventHandler Click          {              add              {                  Events.AddHandler(ClickKey, value);              }              remove              {                  Events.RemoveHandler(ClickKey, value);              }          }           // 定义OnClick事件处理程序          protected virtual void OnClick(EventArgs e)          {              EventHandler clickEventDelegate =                 (EventHandler)Events[ClickKey];              if (clickEventDelegate != null)              {                  clickEventDelegate(this, e);              }          }           // 实现RaisePostBackEvent方法,处理回发事件          public void RaisePostBackEvent(string eventArgument)          {              OnClick(new EventArgs());          }           protected override void Render(HtmlTextWriter output)          {              output.Write("﹤INPUT TYPE=submit name=" + this.UniqueID +                 " Value='确定' /﹥");          }      }  }

下面再来说下客户端回发事件,在HTML窗体元素中只有Button按钮和ImageButton才可以引起窗体回发.

但如LinkButton链接按钮控件要希望启动回发的话,则要依赖客户端脚本的事件机制来实现其功能.

在asp.net2.0中,button控件多了一个UseSubmitBehavior 属性,指示 Button 控件使用客户端浏览器的提交机制(客户端回发)还是 ASP.NET 回发机制,默认采用回发机制,如果设置为false的话,则需要调用GetPostBackEventReference 方法来返回 Button 的客户端回发事件

当设置UseSubmitBehavior 属性为flase时,你运行页面时,则会发现一段自动生成的javascript代码

LinkButton也一样,再看下面例子,定义了枚举,定义button按钮和链接按钮,大家在测试的时候,打开源代码就会发现不同效果

示例三

using System;  using System.Web.UI;  using System.Web.UI.WebControls;  using System.ComponentModel;  namespace CustomComponents  {      public enum ButtonDisplay      {          Button = 0,          Hyperlink = 1      }       [ToolboxData("﹤{0}:SuperButton3 runat=server﹥﹤/{0}:SuperButton3﹥")]      public class SuperButton3 : Control, IPostBackEventHandler      {          public virtual ButtonDisplay Display          {              get             {                  object display = ViewState["Display"];                  if (display == null)                      return ButtonDisplay.Button;                  else                     return (ButtonDisplay)display;              }              set             {                  ViewState["Display"] = value;              }          }           public virtual string Text          {              get             {                  object text = ViewState["Text"];                  if (text == null)                      return string.Empty;                  else                     return (string)text;              }              set             {                  ViewState["Text"] = value;              }          }           private static readonly object ClickKey = new object();           public event EventHandler Click          {              add              {                  Events.AddHandler(ClickKey, value);              }              remove              {                  Events.RemoveHandler(ClickKey, value);              }          }           protected virtual void OnClick(EventArgs e)          {              EventHandler clickEventDelegate =                 (EventHandler)Events[ClickKey];              if (clickEventDelegate != null)              {                  clickEventDelegate(this, e);              }          }           public void RaisePostBackEvent(string argument)          {                            OnClick(EventArgs.Empty);          }           override protected void Render(HtmlTextWriter writer)          {              base.Render(writer);              Page.VerifyRenderingInServerForm(this);               if (Display == ButtonDisplay.Button)              {                  writer.Write("﹤INPUT type=\"submit\"");                  writer.Write(" name=\"" + this.UniqueID + "\"");                  writer.Write(" id=\"" + this.UniqueID + "\"");                  writer.Write(" value=\"" + Text + "\"");                  writer.Write(" /﹥");              }              else if (Display == ButtonDisplay.Hyperlink)              {                  writer.Write("﹤A href=\"");                  writer.Write(Page.GetPostBackClientHyperlink(this, ""));                  writer.Write("\"﹥" + Text + "﹤/A﹥");              }          }      }  }

如果大家本来就学过这方面的知识,看了心里还有谱,如果没有的话,里面有些方法不熟悉的话,还是要多看看MSDN. 说通俗点,回发事件可以就理解为按钮单击事件,而按钮又分两种不同的回发事件方法,这样讲的话,更容易让人接受,而上面所讲的就是实现按钮单击事件实现的方法.

ASP.NET控件开发基础之事件处理二.数据回发事件

好了,接着再讲数据回发.跟上面讲的事件回发有点不同.

下面也举一个简单的例子,看下图,有两个DropDownList,一个开启AutoPostBack,一个没有开启,再接着看下面简单的代码,***个DropDownList,改变下拉框值时,label没显示,按确定按钮后则显示label,第二个DropDownList改变下拉框值时就显示了label,因为开启了AutoPostBack.这个大家都明白吧.

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)     {         Label2.Text = "你选择了:  " + DropDownList1.SelectedItem.Text;     }     protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)     {         Label1.Text = "你选择了:  " + DropDownList2.SelectedItem.Text;     }

以上实现的原理就是在SelectedIndexChanged事件里,判断旧值和新值的比较(比较数据),如果发生变化,则引发事件,数据回发就是实现这样的事件.再重新整理一下思路,明白何时会引发SelectedIndexChanged事件

在选择下拉框值时,如果选的值跟原来的值相同,则不触发事件,如果选的值跟原来的值不同的话则触发SelectedIndexChanged事件(还是旧值和新值的比较).

打开MSDN文档查看DropDownList 类,则发现其继承了 IPostBackDataHandler 接口,我的意思就是说想要实现Change这样的事件,就要继承其接口.看看MSDN对此接口的定义

IPostBackDataHandler 接口
定义 ASP.NET 服务器控件为自动加载回发数据而必须实现的方法。

LoadPostData 方法 根据服务器控件的状态由于回发而发生更改做出判断是否调用RaisePostDataChangedEvent 方法,返回true则调用(就是旧值和新值不同的时候)

RaisePostDataChangedEvent 方法用于引发任何更改事件

以下的例子实现了如同textbox的TextChanged事件

postDataKey表示控件内部数据的关键值,postCollection表示所有传入名称值的集合,其采用索引的方式来访问

using System;  using System.Web;  using System.Web.UI;  using System.Collections.Specialized;  using System.ComponentModel;   namespace CustomComponents  {      [ToolboxData("﹤{0}:Textbox1 runat=server﹥﹤/{0}:Textbox1﹥"),      DefaultProperty("Text")]      public class Textbox1 : Control, IPostBackDataHandler      {          public string Text          {              get             {                  object text = ViewState["Text"];                  if (text == null)                      return string.Empty;                  else                     return (string)text;              }              set             {                  ViewState["Text"] = value;              }          }           public bool LoadPostData(string postDataKey,             NameValueCollection postCollection)          {              string postedValue = postCollection[postDataKey];              //检查新旧数据              if (!Text.Equals(postedValue))              {                  Text = postedValue;                  return true;                  //自动调用RaisePostDataChangedEvent()              }              else                 return false;              //不发生变化          }          public void RaisePostDataChangedEvent()          {              OnTextChanged(EventArgs.Empty);          }           protected virtual void OnTextChanged(EventArgs e)          {              if (TextChanged != null)                  TextChanged(this, e);          }           public event EventHandler TextChanged;           override protected void Render(HtmlTextWriter writer)          {              base.Render(writer);              Page.VerifyRenderingInServerForm(this);              writer.Write("﹤INPUT type=\"text\" name=\"");              writer.Write(this.UniqueID);              writer.Write("\" value=\"" + this.Text + "\" /﹥");          }      }  }

上面实现的方法如同button的onclick事件,其实不然,而是通过回发数据的新旧数据进行判断,我在示例代码中加了另外一个例子,这里就不列出了,大家可以下载后再去看,看了就明白不是button的onclick事件了.

本次主要讲了三个基础的事件处理

(1)捕获回发事件

(2)用于回调的客户端脚本

(3)处理回发数据

以下两个接口需要你慢慢的熟悉和使用

IPostBackEventHandler接口和IPostBackDataHandler 接口.

想到Button按钮就要想到IPostBackEventHandler接口,想要textbox,dropdownlist一些change事件则要想要IPostBackDataHandler 接口,如果结合起来,再自己思考的话,会明白的更深刻.

看完了这篇文章,相信你对"ASP.NET控件开发基础之事件处理的示例分析"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

事件 控件 方法 处理 接口 按钮 数据 委托 客户 客户端 就是 示例 基础 不同 代码 例子 服务器 服务 开发 机制 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 徐州物联网软件开发 高青中小企业oa软件开发公司 国内医疗网络安全事件 适合计算机网络技术的华为笔记本 魔力宝贝归来选哪个服务器 金币服务器 连接登陆服务器失败 网络技术和商务活动关系 广东专业软件开发价目表 北京时代网络技术分类服务标准 数据库用户账户密码加密 社区网络安全大检查总结 重庆涪陵网上生鲜软件开发 在DAO中实现数据库的操作 域名是通过什么方式请求服务器的 c语言服务器中文 服务器死锁是什么 国内云服务器的品牌 网络安全奖申请 坪山区光纤网络技术开发商家 华为网络安全部 部队合同制职工数据库 软件开发工程师应具备什么 网络安全的重要性60字 软件开发常见错误问题 北京时代网络技术分类服务标准 公共信息网络安全监察部门主管 蓝盾网络安全有哪些 数据库如何区别是不是外码 计算机网络技术的叙述正确
0