带有EnterKey事件处理程序的XTextBox扩展文本框

分享于 

10分钟阅读

Web开发

  繁體 雙語

介绍

EXTextBox 是带有输入键事件处理程序的扩展文本框。 这意味着,你可以在 EXTextBox 上按Enter键在服务器端添加一个事件处理程序函数。 当我有一个有多个按钮和文本框的页面,在同一页面中有一个搜索表单时,这个想法。 而且你知道大多数用户使用输入键而不是按搜索表单中的搜索按钮。 这里是问题,我们不能预测将被调用哪个事件,因为我们在同一页中有许多按钮。 所以我认为,如果我有一个可以处理输入键的textbox控件,那就更好了。 像"要求是发明的父亲。"?

像往常一样,我进入了下一步,。 为这里,文本框应该有一个客户端事件,该事件应该在你按下Enter键时发布表单。 所以我为它编写了两个简单的JavaScript函数,__doThis__doARPostBack

__doThis函数
<script language="'javascript'"> 
<!-- function __doThis(fld){ 
 var key = window.event.keyCode;
 if(key == 13){
 __doARPostBack(fld.id,'enterkey_event');
 returnfalse;
 } 
 returntrue;
}// --> </script>
__doARPostBack函数
<script language="'javascript'">
<!--function __doARPostBack(eventTarget, eventArgument) {
 var theform;
 if (window.navigator.appName.toLowerCase().indexOf('netscape')> -1) {
 theform = document.forms[0];
 }
 else {
 theform = document.forms[0];
 }
 ////Set the hidden field values// theform.__EVENTTARGET.value = eventTarget.split('$').join(':');
 theform.__EVENTARGUMENT.value = eventArgument;
 theform.submit();
}// --></script>

代码块被注册到客户端 inside,通过重写它,TextBoxOnInit 函数。 同时,__EVENTTARGET__EVENTARGUMENT 也在页面中注册了两个隐藏字段。 __EVENTTARGET 将携带触发事件的EXTextBox的ID,__EVENTARGUMENT 将携带额外的信息。

protectedoverridevoid OnInit(EventArgs e)
{
 base.OnInit (e); 
 ////Add the Hidden Fields __EVENTTARGET and __EVENTARGUMENT//this.Page.RegisterHiddenField("__EVENTTARGET","");
 this.Page.RegisterHiddenField("__EVENTARGUMENT","");
 ////Add the Client Side Scripts __doPostBack and __doThis//string strScript = @"<script language="'javascript'">
 <!--
 function __doARPostBack(eventTarget, eventArgument) {
 var theform;
 if (window.navigator.appName.toLowerCase().indexOf(
 'netscape')> -1) {
 theform = document.forms[0];
 }
 else {
 theform = document.forms[0];
 }
//
//Set the hidden field values
//
 theform.__EVENTTARGET.value = eventTarget.split('$').join(':');
 theform.__EVENTARGUMENT.value = eventArgument;
 theform.submit();
 }
//-->
 </script>";
 //if(this.Page.ParseControl)this.Page.RegisterClientScriptBlock("doPost",strScript);
 strScript = @"<script language="'javascript'"> 
 function __doThis(fld){ 
 var key = window.event.keyCode;
 if(key == 13){
 __doARPostBack(fld.id,'enterkey_event');
 return false;
 } 
 return true;
 } 
 </script>";
 this.Page.RegisterClientScriptBlock("doThis",strScript);
}

接下来是在textbox的KeyDown 事件中调用 __doThis 函数。 对于这里重写 TextBoxRender 函数。

protectedoverridevoid OnPreRender(EventArgs e)
 {
 if (this.EnterKey!= null)
 {
 this.Attributes.Add("onkeydown","return __doThis(this);");
 }
 base.OnPreRender(e);
 }

现在我们应该设置一个服务器端事件处理程序来服务自定义事件。 为此,我们首先必须声明一个委托函数:

publicdelegatevoid KeyDownHandler(Object sender, KeyEventArgs e);

publicevent KeyDownHandler EnterKey;

然后添加一个函数 OnEnterKey,该函数将在事件期间被调用。

将在哪里调用该事件? 当页回发时,如果控件实现 IPostBackDataHandler 接口,控件可以访问 postback 数据。 这有两个要实现的函数,LoadPostDataRaisePostDataChangedEvent。 我们将使用 LoadPostData 来访问已经发布的后台数据。 这里检查回发数据以获取隐藏字段 __EVENTTARGET__EVENTARGUMENT的值,并相应调用事件处理程序 OnEnterKey

让我们逐步执行实现:

  • 启动新的C# 类库项目 ARLib。
  • 向它添加名为 EXTextBox的类。
  • 将代码 below 粘贴到 EXTextBox.cs file:
using System;using System.Web.UI;using System.Web.UI.WebControls;using System.ComponentModel;using System.IO;using System.Reflection;using System.Text;using System.Text.RegularExpressions;namespace ARLib
{
 publicdelegatevoid KeyDownHandler(Object sender, KeyEventArgs e);
 ///<summary>/// Summary description for TextBox.///</summary>publicclass EXTextBox:System.Web.UI.WebControls.TextBox,
 IPostBackDataHandler
 {
 #region Declarations//private int maxLength=200;publicevent KeyDownHandler EnterKey; 
 #endregion#region Overriden Functionsprotectedoverridevoid OnInit(EventArgs e)
 {
 base.OnInit (e);
 ////Add the Hidden Fields __EVENTTARGET and __EVENTARGUMENT//this.Page.RegisterHiddenField("__EVENTTARGET","");
 this.Page.RegisterHiddenField("__EVENTARGUMENT","");
 ////Add the Client Side Scripts __doPostBack and __doThis//string strScript = @"<script language="'javascript'">
 <!--
 function __doARPostBack(eventTarget, eventArgument) {
 var theform;
 if (window.navigator.appName.toLowerCase().
 indexOf('netscape')> -1) {
 theform = document.forms[0];
 }
 else {
 theform = document.forms[0];
 }
//
//Set the hidden field values
//
 theform.__EVENTTARGET.value = 
 eventTarget.split('$').join(':');
 theform.__EVENTARGUMENT.value = eventArgument;
 theform.submit();
 }
//-->
 </script>";
 //if(this.Page.ParseControl)this.Page.RegisterClientScriptBlock("doPost",strScript);
 strScript = @"<script language="'javascript'"> 
 function __doThis(fld){ 
 var key = window.event.keyCode;
 if(key == 13){
 __doARPostBack(fld.id,'enterkey_event');
 return false;
 } 
 return true;
 } 
 </script>";
 this.Page.RegisterClientScriptBlock("doThis",strScript);
 }protectedoverridevoid OnPreRender(EventArgs e)
 {
 if (this.EnterKey!= null)
 {
 this.Attributes.Add("onkeydown","return __doThis(this);");
 }
 base.OnPreRender(e);
 }#endregion#region EventHandlerprotectedvirtualvoid OnEnterKey(KeyEventArgs e)
 {
 if(this.EnterKey!= null)
 this.EnterKey(this, e);
 }#endregion#region IPostBackDataHandler Members 
 publicvoid RaisePostDataChangedEvent()
 {
 // Do Nothing }
 publicbool LoadPostData(string postDataKey, 
 System.Collections.Specialized.NameValueCollection 
 postCollection)
 {
 this.Text = postCollection[postDataKey];
 string et = postCollection["__EVENTTARGET"].Trim();
 string ea = postCollection["__EVENTARGUMENT"].Trim();
 ////Compare the Event Target et with the Controls ID to see//whther this control is posted back//if(et.CompareTo(this.ClientID.Trim())==0 )
 {
 switch(ea)
 {
 case"enterkey_event":
 ////Invoke the EnterKey Event// KeyEventArgs k = new KeyEventArgs();
 k.TextBoxID = this.ID;
 k.Text = postCollection[postDataKey];
 this.OnEnterKey(k);
 break; 
 }
 }
 returnfalse;
 }#endregion#region Properties#endregion}#region KeyEventArgs Classpublicclass KeyEventArgs:System.EventArgs
 { 
 privatestring textBoxID;
 privatestring text;
 public KeyEventArgs()
 { 
 }
 publicstring TextBoxID
 {
 set {
 this.textBoxID = value;
 }
 get {
 returnthis.textBoxID;
 }
 }
 publicstring Text
 {
 set {
 this.text = value;
 }
 get {
 returnthis.text;
 }
 }
 }#endregion}
  • 编译库。
  • 启动一个新的网页项目并向它添加一个网页表单。
  • 右键单击工具箱并选择添加/移除项并选择 DLL ARLib。
  • 将这里实例的实例添加到Web窗体。 然后为 EnterKey 事件添加事件处理程序,如下所示:
this.EXTextBox1.EnterKey += new ARLib.KeyDownHandler(
 this.EXTextBox_EnterKey);privatevoid EXTextBox_EnterKey(object sender, ARLib.KeyEventArgs e)
{
 Response.Write(e.Text);
}

KeyEventArgs 类提供引发事件的TextBoxTextID

希望这对你有帮助。


ext  文本  TEX  EVE  event  Extend  
相关文章