add 一个新web control library project,class命名为MyTextBoxpublic class MyTextBox : TextBox { //不用改变任何东东,只需重写Text Attribute: public override string Text { set { base.Text = StringIWant(value); } get { return base.Text;} } private string StringIWant(string originalString) { //logic how to mask the string return stringIWant; } }
Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress If TextBox1.Text.Length > 4 Then e.KeyChar = Chr(0) End If If TextBox1.Text.Length = 1 Then If e.KeyChar <> Chr(46) Then’判断第二位是否为'.' e.KeyChar = Chr(0) End If Else If (e.KeyChar < Chr(48) Or e.KeyChar > Chr(57)) And _ e.KeyChar <> Chr(8) And e.KeyChar <> Chr(13) And e.KeyChar <> Chr(9) Then '判断是否为数字且不为退格键及Enter键 e.KeyChar = Chr(0) '不是数字则为空 End If End If End Sub
Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress If TextBox1.Text.Length = 1 Then If e.KeyChar <> Chr(46) Then’判断第二位是否为'.' e.KeyChar = Chr(0) End If Else If (e.KeyChar < Chr(48) Or e.KeyChar > Chr(57)) And _ e.KeyChar <> Chr(8) And e.KeyChar <> Chr(13) And e.KeyChar <> Chr(9) Then '判断是否为数字且不为退格键及Enter键 e.KeyChar = Chr(0) '不是数字则为空 End If End If If TextBox1.Text.Length > 4 Then e.KeyChar = Chr(0) End If End Sub 这样子效果可能会好一点。
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using FSSoft.Common;
using FSSoft.Web.UI;
namespace FSSoft.Web.Controls
{
/// <summary>
/// 数字文本框WEB控件。
/// </summary>
/// <res>JS内需有RegularCheck和TrimControl函数。</res>
[DefaultProperty("CheckNumType"),
ToolboxData("<{0}:CNumTextBox runat=server></{0}:CNumTextBox>")]
public class CNumTextBox : TextBox
{
private CheckType_Num checkType;
private NotValidEvent validEvent;
private string notValidMsgkey=string.Empty;
/// <summary>
/// 已屏蔽。
/// </summary>
[Browsable(false)]
public override int Columns
{
get
{
return base.Columns;
}
}
/// <summary>
/// 已屏蔽。
/// </summary>
[Browsable(false)]
public override int Rows
{
get
{
return base.Rows;
}
}
/// <summary>
/// 已屏蔽。
/// </summary>
[Browsable(false)]
public override TextBoxMode TextMode
{
get
{
return base.TextMode;
}
}
/// <summary>
/// 已屏蔽。
/// </summary>
[Browsable(false)]
public override bool Wrap
{
get
{
return base.Wrap;
}
}
/// <summary>
/// 设置或取得本控件数字检查类型。
/// </summary>
[
Category("Check"),
Description(@"设置或取得本控件数字检查类型:
ZZValidNumeric1:數字(包含全角);
ZZValidNumeric2:非負數字(包含全角);
ZZValidInt1:非負整數(包含全角);
ZZValidInt2:整數(包含全角);
ZZValidInt3:負整數(包含全角);
ZZValidInt4:正整數(包含全角);
ZZValidInt5:非正整數(包含全角);")
]
public virtual CheckType_Num CheckNumType
{
set
{
checkType=value;
}
get
{
return checkType;
}
}
/// <summary>
/// 设置或取得不正确文本验证事件处理类型。
/// </summary>
[
Category("Check"),
Description(@"设置或取得本控件事件处理:
Clear:清空;
AlertandSelect:弹出提示框并全选文本;
AlertandClear:弹出提示框并清空文本;")
]
public virtual NotValidEvent NotValidEventType
{
set
{
if(value==NotValidEvent.Clear)
{
notValidMsgkey=string.Empty;
}
validEvent=value;
}
get
{
return validEvent;
}
}
/// <summary>
/// 设置或取得提示框信息key。
/// </summary>
[
Category("Check"),
Description("设置或取得提示框信息key")
]
public virtual string NotValidMsgkey
{
set
{
if(validEvent!=NotValidEvent.Clear)
{
notValidMsgkey=value;
}
else
{
notValidMsgkey=string.Empty;
}
}
get
{
return notValidMsgkey.Trim();
}
}
private bool imeDisabled=false;
/// <summary>
/// 输入法设置。
/// </summary>
[
Category("Behavior"),
Description("输入法设置。")
]
public bool IMEDisabled
{
set
{
imeDisabled=value;
}
get
{
return imeDisabled;
}
}
private Textalign textalign=Textalign.right;
/// <summary>
/// 文本框文本对齐方式。
/// </summary>
[
Category("Appearance"),
Description("文本框文本对齐方式设置。")
]
public virtual Textalign TBTextAlign
{
set
{
textalign=value;
}
get
{
return textalign;
}
}
/// <summary>
/// 禁止TextChanged自动刷新。
/// </summary>
public override bool AutoPostBack
{
get
{
return base.AutoPostBack;
}
}
/// <summary>
/// 根据设置取得当前正则表达式验证字符串。
/// </summary>
/// <returns>返回当前正则表达式字符串。</returns>
public string getRegularItem()
{
switch(checkType)
{
case CheckType_Num.ZZValidNumeric1:
return RegularItems.ZZValidNumeric1;
case CheckType_Num.ZZValidNumeric2:
return RegularItems.ZZValidNumeric2;
case CheckType_Num.ZZValidInt1:
return RegularItems.ZZValidInt1;
case CheckType_Num.ZZValidInt2:
return RegularItems.ZZValidInt2;
case CheckType_Num.ZZValidInt3:
return RegularItems.ZZValidInt3;
case CheckType_Num.ZZValidInt4:
return RegularItems.ZZValidInt4;
case CheckType_Num.ZZValidInt5:
return RegularItems.ZZValidInt5;
default:
return RegularItems.ZZValidNumeric1;
}
}
/// <summary>
/// 属性修改。
/// </summary>
/// <param name="e"></param>
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
string strEvent=string.Empty;
switch(NotValidEventType)
{
case NotValidEvent.Clear:
strEvent="this.value='';this.focus();";
break;
case NotValidEvent.AlertandSelect:
strEvent=string.Format("this.select();alert('{0}');",Language.Msg(NotValidMsgkey));
break;
case NotValidEvent.AlertandClear:
strEvent=string.Format("this.select();alert('{0}');this.value='';this.select();",Language.Msg(NotValidMsgkey));
break;
}
base.Attributes.Add("onblur","TrimControl(this);if(this.value!=''&&!RegularCheck(this.value,'"+getRegularItem()+"')){"+strEvent+"}");
base.Attributes.Add("onpaste","return false");
base.Attributes.Add("ondrop", "return false");
if(imeDisabled)
{
base.Style.Add("ime-mode","disabled");
}
if(textalign!=Textalign.NoSet)
{
base.Style.Add("text-align",textalign.ToString());
}
}
}
}看看这个。,这是数字的
//给你参考下吧,在ProcessKeyEventArgs中来做处理,对于你说的长度之类的,我觉得最关键的是控制只能输入数字,长度你应该很容易搞定的。
protected override bool ProcessKeyEventArgs(ref Message m)
{
int s = m.WParam.ToInt32(); if ((s < 48) || (s > 57))
{
/*
* s==46表示"."
* s==8表示"Backspace"键
*/
if (s != 46 && s != 8)
{
return true;
} //如果已经输入了一个"."了,那么不能再输入".",也就是一个数值只能有一个"."
if (s == 46)
{
if (this._Value.ToString().Contains("."))
return true;
}
} return base.ProcessKeyEventArgs(ref m);
}
希望对你有帮助
http://web.hnce.com.cn/hulianwang/wangluobiancheng/NET/2008/2/79664614.html
{
//不用改变任何东东,只需重写Text Attribute:
public override string Text
{
set { base.Text = StringIWant(value); }
get { return base.Text;}
} private string StringIWant(string originalString)
{
//logic how to mask the string return stringIWant;
}
}
e.KeyChar = Chr(0)
End If
If TextBox1.Text.Length = 1 Then
If e.KeyChar <> Chr(46) Then’判断第二位是否为'.'
e.KeyChar = Chr(0)
End If
Else
If (e.KeyChar < Chr(48) Or e.KeyChar > Chr(57)) And _
e.KeyChar <> Chr(8) And e.KeyChar <> Chr(13) And e.KeyChar <> Chr(9) Then '判断是否为数字且不为退格键及Enter键
e.KeyChar = Chr(0) '不是数字则为空
End If
End If
End Sub
If TextBox1.Text.Length = 1 Then
If e.KeyChar <> Chr(46) Then’判断第二位是否为'.'
e.KeyChar = Chr(0)
End If
Else
If (e.KeyChar < Chr(48) Or e.KeyChar > Chr(57)) And _
e.KeyChar <> Chr(8) And e.KeyChar <> Chr(13) And e.KeyChar <> Chr(9) Then '判断是否为数字且不为退格键及Enter键
e.KeyChar = Chr(0) '不是数字则为空
End If
End If
If TextBox1.Text.Length > 4 Then
e.KeyChar = Chr(0)
End If
End Sub
这样子效果可能会好一点。
private void textBox1_TextChanged(object sender, EventArgs e)
{
string s = textBox1.Text;
if (s.IndexOf('.') == -1 && s.Length >= 2)
{
textBox1.Text = undotext;
}
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
undotext = textBox1.Text;
if (e.KeyChar == '.' && undotext.IndexOf('.') != -1)
e.KeyChar = '\0';
else if (e.KeyChar == '.' && undotext.Length == 0)
e.KeyChar = '\0';
else
{
if ((Convert.ToInt32(e.KeyChar) < 48 || Convert.ToInt32(e.KeyChar) > 57 ) && e.KeyChar != '.' && e.KeyChar != '\b')
e.KeyChar = '\0';
}
}
在validing事件写上就行,
用正则应该可以.
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;namespace OverrunPrint
{
/// <summary>
/// MaskTextBox 的摘要说明。
/// </summary>
public class MaskTextBox : System.Windows.Forms.TextBox
{ #region 系统定义内容 /// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null; public MaskTextBox():base()
{ //初始化正则表达式类
this.regex = new System.Text.RegularExpressions.Regex(this.sRegExInner); //将TextChanged事件与自定义的该事件的处理方法进行关联 一般说,如果直接在TextChanged事件做,由于不断的对this.Text进行赋值操作,
//则会不断的引起该事件 所以可以采取委托与其进行关联,当触发时,只进行了一次触发,而不是连续触发
this.TextChanged += new EventHandler(this.fCheck); } /// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
} #endregion 系统定义内容 #region 自定义变量
//设置正则表达式串,默认为 可以输入26个英文字母、数字、下划线等(在外部输入中,系统会自动处理"\"的问题,所以不用在加@)
private string sRegExInner = @"^\d*$"; private System.Text.RegularExpressions.Regex regex; public string sRegEx
{
get
{
return sRegExInner;
}
set
{
//在设置变量的时候声明正则表达式类;否则由于对象已生成,则正则表达式形式已固化在对象之中,则外部设置是没有任何意义的(已更改不了已生成对象的正则表达式形式)
this.sRegExInner = value;
regex = new System.Text.RegularExpressions.Regex(this.sRegExInner);
}
}
//用于记录先前的TextBox中的值,当输入不合法的字符串时,要对其进行
private string sOldValue =""; #endregion #region 自定义方法
//进行校验
private void fCheck(object sender,System.EventArgs e)
{
if(this.regex.Match(this.Text).Success)
{
this.sOldValue = this.Text;
}
else
{
//以下内容,涉及到对this.Text进行了两次赋值,一次赋值时,并没有当时就再引发TextChanged事件,第二次才引发
if (this.sOldValue==string.Empty)
{
this.Text = this.sOldValue;
//追加空串,目的是将光标移至最后
this.AppendText("");
}
else
{
this.Text = "";
//追加空串,目的是将光标移至最后
this.AppendText("");
}
}
}//函数体结束 #endregion 自定义方法
}//类定义结束
}