标题:自已实现服务器控件之 TextBox 控件
声明:本帖只是一个测试Demo,所以,不会写得太规范,也不会考虑到安全性.以方便为 主.所以,用得到的朋友在项目中使用的时候,还希望对其进行改进.
环境
开发工具: VS.net 2003
作者:文刀无尽
日期:2006-02-23
读者要求:有一定的编程经验.
实现功能:
1.在页面回发时,保存文本框中文本.
2.可以选择TextBox的模式
1)单行模式
2)密码模式
3)多行模式
3.自定义事件
原理:
1.在页面回发时,保存文本框中文本.
利用IPostBackDataHandler接口的LoadPostData实现取
到回发的文本.再给属性赋值,这样的话,在页面重新初始化
的时候,就可以保持原来的文本值
2.可以选择TextBox的模式
定义一个模式枚举,在选择不同的模式时,生成
不同的控件.
3.自定义事件
利用IPostBackEventHandler接口的RaisePostBackEvent实现
对回发的事件进行检查,得到相应的回发事件,再激发自定义的
事件.
用IPostBackEventHandler接口后,在客户端会生成如下代码
<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<script language="javascript" type="text/javascript">![](https://www.cnblogs.com/Images/dot.gif)
<!--
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
function __doPostBack(eventTarget, eventArgument)
{
var theform;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1)
{
theform = document.Form1;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
else
{
theform = document.forms["Form1"];
}
theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
// -->
</script>
output.AddAttribute("Onkeyup","jscript:"+ Page.GetPostBackEventReference(this, "Onkeyup"));
客户端生成如下代码
Onkeyup="jscript:__doPostBack('TextBox2','Onkeyup')"
就是利用上面生成的脚本对回发事件进行处理.
各个接口具体作用,参见MSDN
效果图
![](/images/cnblogs_com/skyendless/ImgDotNet/TextBox效果.JPG)
下面是全部代码
页面代码
Aspx文件
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ Register TagPrefix="cc1" Namespace="Skyendless.MyControls" Assembly="MyControls" %>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="ControlsTry.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<FONT face="宋体"></FONT>
<cc1:textbox id="TextBox2" style="Z-INDEX: 101; LEFT: 232px; POSITION: absolute; TOP: 136px"
runat="server" Height="24px" Width="104px" Text="dgfd"></cc1:textbox><asp:label id="Label1" style="Z-INDEX: 102; LEFT: 424px; POSITION: absolute; TOP: 136px" runat="server"
Height="32px" Width="88px">Label</asp:label>
<cc1:TextBox id="TextBox1" style="Z-INDEX: 103; LEFT: 232px; POSITION: absolute; TOP: 184px"
runat="server" Height="32px" Width="128px" Text="sdfdsf" TextMode="Password"></cc1:TextBox>
<cc1:TextBox id="TextBox3" style="Z-INDEX: 104; LEFT: 224px; POSITION: absolute; TOP: 232px"
runat="server" Height="88px" Width="128px" Text="sdfdsfsdfsdfsdfdsf" TextMode="MultiLine"></cc1:TextBox></form>
</body>
</HTML>
![](/Images/OutliningIndicators/None.gif)
Cs文件
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
![](/Images/OutliningIndicators/None.gif)
namespace ControlsTry
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// WebForm1 的摘要说明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
protected Skyendless.MyControls.TextBox TextBox2;
protected Skyendless.MyControls.TextBox TextBox1;
protected Skyendless.MyControls.TextBox TextBox3;
protected System.Web.UI.WebControls.Label Label1;
private void Page_Load(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// 在此处放置用户代码以初始化页面
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.TextBox2.keyup += new System.EventHandler(this.TextBox2_keyup);
this.Load += new System.EventHandler(this.Page_Load);
![](/Images/OutliningIndicators/InBlock.gif)
}
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
private void Button1_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
private void TextBox2_keyup(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.Label1.Text = this.TextBox2.Text;
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
}
}
![](/Images/OutliningIndicators/None.gif)
下面是控件代码
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//*****************************************************
*
*功能:实现TextBox服务器控件的部分功能
*作者:文刀无尽
*日期:2006-02-23
![](/Images/OutliningIndicators/InBlock.gif)
***************************************************/
using System;
using System.Web.UI;
using System.Web.UI.Design;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.ComponentModel.Design;
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
namespace Skyendless.MyControls
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 类型枚举,单行,密码,多行
/// </summary>
public enum TextBoxMode
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
SingleLine
,Password
,MultiLine
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
[DefaultProperty("Text"),
ToolboxData("<{0}:TextBox runat=server></{0}:TextBox>")]
public class TextBox : System.Web.UI.WebControls.WebControl,IPostBackDataHandler,IPostBackEventHandler
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
[私有变量]#region [私有变量]
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 输出文本
/// </summary>
private string _text;
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// TextBox模式
/// </summary>
private TextBoxMode _textMode;
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 回传时是否保持
/// </summary>
private bool _enableViewState = true;
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
[定义事件]#region [定义事件]
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 定义keyup时事件
/// </summary>
public event EventHandler keyup;
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
[自定义属性]#region [自定义属性]
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 输出
/// </summary>
[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string Text
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _text;
}
![](/Images/OutliningIndicators/InBlock.gif)
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_text = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// TextBox模式
/// </summary>
[Bindable(true),
Category("行为"),
DefaultValue("")]
public TextBoxMode TextMode
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _textMode;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_textMode = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 是否保持状态
/// </summary>
public override bool EnableViewState
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return _enableViewState;
}
set
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
_enableViewState = value;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
[事件]#region [事件]
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// keyup事件
/// </summary>
/// <param name="e"></param>
protected void Onkeyup(EventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
keyup(this, e);
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//
//将需要呈现的 HTML 属性和样式添加到指定
//的输出流中
//
AddAttributesToRender(output);
output.AddAttribute(HtmlTextWriterAttribute.Name,this.UniqueID);
output.AddAttribute("Onkeyup","jscript:"+ Page.GetPostBackEventReference(this, "Onkeyup"));
SetTextBoxMode(this.TextMode,output);
output.RenderEndTag(); //控件结束
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
private void SetTextBoxMode(TextBoxMode textMode,HtmlTextWriter output)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
switch (textMode)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
case TextBoxMode.SingleLine:
output.AddAttribute(HtmlTextWriterAttribute.Value,Text);
output.AddAttribute(HtmlTextWriterAttribute.Type,"text");
output.RenderBeginTag(HtmlTextWriterTag.Input);
break;
case TextBoxMode.MultiLine:
output.AddAttribute(HtmlTextWriterAttribute.Rows,"2");
output.AddAttribute(HtmlTextWriterAttribute.Cols,"10");
output.RenderBeginTag(HtmlTextWriterTag.Textarea);
output.Write(Text);
break;
case TextBoxMode.Password:
output.AddAttribute(HtmlTextWriterAttribute.Value,Text);
output.AddAttribute(HtmlTextWriterAttribute.Type,"password");
output.RenderBeginTag(HtmlTextWriterTag.Input);
![](/Images/OutliningIndicators/InBlock.gif)
break;
default :
output.AddAttribute(HtmlTextWriterAttribute.Type,"text");
output.RenderBeginTag(HtmlTextWriterTag.Input);
break;
![](/Images/OutliningIndicators/InBlock.gif)
}
}
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IPostBackDataHandler 成员#region IPostBackDataHandler 成员
![](/Images/OutliningIndicators/InBlock.gif)
public void RaisePostDataChangedEvent()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// TODO: 添加 ctLogin.RaisePostDataChangedEvent 实现
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 这个事件在回发时激发
/// 让文本框在回发时,保持
/// 文本内容
/// </summary>
/// <param name="postDataKey"></param>
/// <param name="postCollection"></param>
/// <returns></returns>
public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// TODO: 添加 ctLogin.LoadPostData 实现
string presentValue = Text;
string postedValue = postCollection[this.UniqueID];
![](/Images/OutliningIndicators/InBlock.gif)
if(_enableViewState == true)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
Text = postedValue;
}
return false;
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
IPostBackEventHandler 成员#region IPostBackEventHandler 成员
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 在这里处理回发的事件
/// </summary>
/// <param name="eventArgument"></param>
public void RaisePostBackEvent(string eventArgument)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//
//在这里判断是哪一种类型事件
//
![](/Images/OutliningIndicators/InBlock.gif)
if(eventArgument == "Onkeyup")
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Onkeyup(EventArgs.Empty);
}
// TODO: 添加 Label.RaisePostBackEvent 实现
}
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
}
}
![](/Images/OutliningIndicators/None.gif)