TextBox 控件的扩展, Help!!!

honghuali 2008-12-12 01:23:46
扩展功能(WEB项目中):
1.新增下拉功能, 下拉显示的数据从数据库中读取,

2.TextBox里的文本, 即可以自己输入, 也可以从下拉选择。

望有经验的朋友, 给点思路, 最好有实例。


多谢!
...全文
191 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wb186 2008-12-12
  • 打赏
  • 举报
回复
呵呵 楼主肯定知道combobox滴!所以……
5楼很强
wengjj1985 2008-12-12
  • 打赏
  • 举报
回复
combobox
c11_11_11 2008-12-12
  • 打赏
  • 举报
回复

/**/
/// <summary>
/// 根据设置的验证数据类型返回不同的正则表达式样
/// </summary>
/// <returns></returns>
#region GetRegex
private string GetValidRegex()
{
string regex = @"(\S)";
switch (this.ValidType)
{
case DataType.Never:
break;
case DataType.Int:
error = "*必须为整数";
regex = @"(-)?(\d+)";
break;
case DataType.IntPostive:
error = "*必须为大于0的整数";
regex = @"([1-9]{1}\d*)";
break;
case DataType.IntZeroPostive:
error = "*必须为不小于0的整数";
regex = @"(\d+)";
break;
case DataType.Float:
error = "*必须为数字";
regex = @"(-)?(\d+)(((\.)(\d)+))?";
break;
case DataType.FloatPostive:
error = "*必须为大于0的数字";
regex = @"(\d+)(((\.)(\d)+))?";
break;
case DataType.FloatZeroPostive:
error = "*必须为不小于0的数字";
regex = @"(\d+)(((\.)(\d)+))?";
break;
case DataType.Url:
error = "*URL格式错误";
regex = @"(http://)?([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";
break;
case DataType.Mail:
error = "*EMail格式错误";
regex = @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
break;
case DataType.ChineseChars:
error = "*只能输入中文字符";
regex = @"[\u4e00-\u9fa5]*";
break;
case DataType.EnglishChars:
error = "*只能输入英文字符";
regex = @"[a-zA-Z]*";
break;
case DataType.EngNum:
error = "*只能输入英文字符和数字";
regex = @"[a-zA-Z0-9]*";
break;
case DataType.EngNumUnerline:
error = "*只能输入英文字符、数字和下划线";
regex = @"[a-zA-Z0-9_]*";
break;
case DataType.PhoneNumber:
error = "*电话号码格式错误";
regex = @"\d{3,4}-\d{7,8}(-\d{1,4})?";
//regex = @"(0\d{2,3})?(-)?(\d{7,8})(-)?(\d{1,5})?";
break;
case DataType.MobileNumber:
error = "*手机号码格式错误";
regex = @"(0)?(1)\d{10}";
break;
case DataType.PostalCode:
error = "*邮编格式错误";
regex = @"\d{6}";
break;
case DataType.Date:
error = "*日期格式错误(YYYY-MM-DD)";
regex = @"^(((((0[48]00)|(0[1-9]((0[48])|([2468][048])|([13579][26]))))-02-29)|((0[1-9][0-9][0-9])-((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30))|(((0[1-9])|(1[0-2]))-((0[1-9])|(1[0-9])|(2[0-8])))))))|((((((([13579][26])|([2468][048]))00)|([1-9][0-9]((0[48])|([13579][26])|([2468][048]))))-02-29)|(([1-9][0-9][0-9][0-9])-((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30))|(((0[1-9])|(1[0-2]))-((0[1-9])|(1[0-9])|(2[0-8])))))))|((((00((0[48])|([2468][048])|([13579][26])))-02-29)|((00((0[1-9])|([1-9][0-9])))-((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30))|(((0[1-9])|(1[0-2]))-((0[1-9])|(1[0-9])|(2[0-8])))))))$";
break;
case DataType.IdentityCode:
error = "*身份证号码格式错误";
regex = @"\d{18}";
break;
case DataType.QQ:
error = "*QQ号码格式错误";
regex = @"[1-9][0-9]{4,}";
break;
case DataType.IP:
error = "*IP地址格式错误";
regex = @"\d+\.\d+\.\d+\.\d+";
break;
case DataType.Custom:
error = "*格式错误";
regex = this.ValidExpressionCustom;
break;
default:
break;
}
if (this.ValidError.Trim() != "")
error = this.ValidError;
return regex;
}
#endregion

#region 将此控件呈现给指定的输出参数
/**/
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
{
base.Render(output);
output.Write(" ");


// base.
if (!this.AllowEmpty)
{
this.rfvDataInput.ID = "rfv" + base.ID;
this.rfvDataInput.ControlToValidate = base.ID;
//output.
//this.Attributes.Add("onfocus", "WdatePicker({isShowWeek:true})");
this.rfvDataInput.RenderControl(output);
}

if (this.ValidType != DataType.Never && this.ValidType != DataType.String)
{
this.revDataInput.ID = "rev" + base.ID;
this.revDataInput.ControlToValidate = base.ID;
this.revDataInput.ValidationExpression = this.GetValidRegex();
this.revDataInput.ErrorMessage = error;
// this.Attributes.Add("onfocus", "WdatePicker({isShowWeek:true})");
this.revDataInput.RenderControl(output);
}
//output.WriteAttribute
}
#endregion

}
}
c11_11_11 2008-12-12
  • 打赏
  • 举报
回复
[Category("自定义信息区")]
[DefaultValue("false"), RefreshProperties(RefreshProperties.Repaint), Description("验证控件的字体删除线"), NotifyParentProperty(true)]
public bool ValidateFontStrikeout
{
get
{

if (ViewState["ValidateFontStrikeout"] != null)
return (bool)ViewState["ValidateFontStrikeout"];
return false;
}
set { ViewState["ValidateFontStrikeout"] = value; }
}
[Category("自定义信息区")]
[DefaultValue(""), RefreshProperties(RefreshProperties.Repaint), Description("验证控件的CSSClass属性"), NotifyParentProperty(true)]
public string ValidateCSSClass
{
get
{

if (ViewState["ValidateCSSClass"] != null)
return ViewState["ValidateCSSClass"].ToString();
return string.Empty;
}
set { ViewState["ValidateCSSClass"] = value; }
}
[Category("自定义信息区")]
[DefaultValue("false"), RefreshProperties(RefreshProperties.Repaint), Description("验证控件的字体下划线"), NotifyParentProperty(true)]
public bool ValidateFontUnderline
{
get
{

if (ViewState["ValidateFontUnderline"] != null)
return (bool)ViewState["ValidateFontUnderline"];
return false;
}
set { ViewState["ValidateFontUnderline"] = value; }
}
[Category("自定义信息区"), DefaultValue(""), Description("验证控件的字体名")]
[Editor("System.Drawing.Design.FontNameEditor, System.Drawing.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor)), TypeConverter(typeof(FontConverter.FontNameConverter))]
public string ValidateFontName
{
get
{
if (ViewState["ValidateFontName"] != null)
return (string)ViewState["ValidateFontName"];
return string.Empty;
}
set
{
ViewState["ValidateFontName"] = value;
}
}

#endregion

#region 构造函数
public xxxTextBox() { }
#endregion

#region 重写子控件
protected override void EnsureChildControls()
{
this.rfvDataInput.CssClass = this.CssError;
this.rfvDataInput.ErrorMessage = "*输入不能为空";
this.rfvDataInput.Display = System.Web.UI.WebControls.ValidatorDisplay.Dynamic;
this.rfvDataInput.EnableViewState = true;
this.rfvDataInput.ControlToValidate = base.ID;
this.rfvDataInput.ForeColor = ValidateForeColor;

this.rfvDataInput.BackColor = ValidateBackColor;
if (ValidateFontSize != null)
{
this.rfvDataInput.Font.Size = ValidateFontSize;
}

this.rfvDataInput.Font.Bold = ValidateFontBold;
this.rfvDataInput.Font.Italic = ValidateFontItalic;
this.rfvDataInput.Font.Strikeout = ValidateFontStrikeout;
this.rfvDataInput.Font.Overline = ValidateFontOverLine;
this.rfvDataInput.Font.Underline = ValidateFontUnderline;
if (!string.IsNullOrEmpty(ValidateFontName))
this.rfvDataInput.Font.Name = ValidateFontName;
if (!string.IsNullOrEmpty(ValidateCSSClass))
this.rfvDataInput.CssClass = ValidateCSSClass;

this.revDataInput.CssClass = this.CssError;
this.revDataInput.ErrorMessage = "*输入格式错误";
this.revDataInput.Display = System.Web.UI.WebControls.ValidatorDisplay.Dynamic;
this.revDataInput.EnableViewState = true;
this.revDataInput.ControlToValidate = base.ID;
this.revDataInput.ForeColor = ValidateForeColor;

this.revDataInput.BackColor = ValidateBackColor;
if (ValidateFontSize != null)
{
this.revDataInput.Font.Size = ValidateFontSize;
}
this.revDataInput.Font.Bold = ValidateFontBold;
this.revDataInput.Font.Bold = ValidateFontBold;
this.revDataInput.Font.Italic = ValidateFontItalic;
this.revDataInput.Font.Strikeout = ValidateFontStrikeout;
this.revDataInput.Font.Overline = ValidateFontOverLine;
this.revDataInput.Font.Underline = ValidateFontUnderline;
if (!string.IsNullOrEmpty(ValidateFontName))
this.revDataInput.Font.Name = ValidateFontName;
if (!string.IsNullOrEmpty(ValidateCSSClass))
this.revDataInput.CssClass = ValidateCSSClass;

//将子控件添加到此自定义控件中
this.Controls.Add(rfvDataInput);
this.Controls.Add(revDataInput);

this.Controls.Add(pnlFrame);
if (this.ValidType == DataType.Date)
this.Attributes.Add("onfocus", "WdatePicker({isShowClear:false,readOnly:true})");
}
#endregion
c11_11_11 2008-12-12
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Design;

namespace xxx.Web.Control.xxxTextBox
{
/**/
/// <summary>
/// author rual by 2008-8-10
/// 重写的TextBox控件
/// <summary>
#region 枚举数据

/**/
/// <summary>
/// 验证数据类型
/// </summary>
public enum DataType
{
Never, //不验证
String, //字符串
Int, //整数
IntPostive, //大于0的整数
IntZeroPostive, //大于等于0的整数
Float, //数字
FloatPostive, //大于0的数字
FloatZeroPostive, //大于等于0的数字
Url,//URL 验证
Mail,//邮件验证
Date, //日期
ChineseChars, //汉字字符串
EnglishChars, //英文
EngNum, //英文和数字
EngNumUnerline, //英文、数字和下划线
PhoneNumber, //电话号码
MobileNumber, //手机号码
PostalCode, //邮政编码
QQ, //QQ号码
IdentityCode, //身份证号码
IP, //IP地址
Custom//自定义验证
}
#endregion

/**/
/// Attribute DefaultProperty指定组件的默认属性,ToolboxData指定当从IDE工具中的工具箱中拖动自定义控件时为它生成的默认标记
[DefaultProperty("AllowEmpty"), ToolboxData("<{0}:xxxTextBox runat=server></{0}:xxxTextBox>")]

public class xxxTextBox : System.Web.UI.WebControls.TextBox
{
#region 子控件
//private System.Web.UI.WebControls.TextBox txtDataInput = new TextBox();
private System.Web.UI.WebControls.RequiredFieldValidator rfvDataInput = new RequiredFieldValidator();
private System.Web.UI.WebControls.RegularExpressionValidator revDataInput = new RegularExpressionValidator();
private Panel pnlFrame = new Panel(); //承载其它控件的容器Panel控件
#endregion

private string error = "";

#region 控件自定义属性

[Bindable(true)]
[Category("自定义信息区")]
[Browsable(true)]
[Description("是否允许空值")]
[DefaultValue("true")]
public bool AllowEmpty
{
get { return ViewState["AllowEmpty"] == null ? true : (bool)ViewState["AllowEmpty"]; }
set { ViewState["AllowEmpty"] = value; }
}

[Bindable(true)]
[Category("自定义信息区")]
[Browsable(true)]
[Description("验证数据类型,默认为不验证")]
[DefaultValue("IntPostive")]
public DataType ValidType
{
get { return ViewState["ValidType"] == null ? DataType.Never : (DataType)ViewState["ValidType"]; }
set { ViewState["ValidType"] = value; }
}

[Bindable(true)]
[Browsable(true)]
[Category("自定义信息区")]
[Description("自定义验证错误信息")]
[DefaultValue("")]
public string ValidError
{
get { return ViewState["ValidError"] == null ? "" : (string)ViewState["ValidError"]; }
set { ViewState["ValidError"] = value; }
}

[Bindable(true)]
[Browsable(true)]
[Category("自定义信息区")]
[Description("自定义用于验证的正则表达式,ValidType 为 Custom 时有效")]
[DefaultValue("")]
public string ValidExpressionCustom
{
get { return ViewState["ValidExpressionCustom"] == null ? "" : (string)ViewState["ValidExpressionCustom"]; }
set { ViewState["ValidExpressionCustom"] = value; }
}

[Bindable(true)]
[Browsable(true)]
[Category("自定义信息区")]
[Description("错误信息提示的CSS类名")]
[DefaultValue("")]
public string CssError
{
get { return ViewState["CssError"] == null ? "" : (string)ViewState["CssError"]; }
set { ViewState["CssError"] = value; }
}

[Bindable(true)]
[Browsable(true)]
[Category("自定义信息区")]
[Description("验证控件的前景色")]
[DefaultValue("")]
public Color ValidateForeColor
{
get
{
if (ViewState["ValidateForeColor"] == null)
return Color.Red;
return (Color)ViewState["ValidateForeColor"];
}
set { ViewState["ValidateForeColor"] = value; }
}

[Bindable(true)]
[Browsable(true)]
[Category("自定义信息区")]
[Description("验证控件的背景色")]
[DefaultValue("")]
public Color ValidateBackColor
{
get
{
if (ViewState["ValidateBackColor"] == null)
return Color.Transparent;
return (Color)ViewState["ValidateBackColor"];
}
set { ViewState["ValidateBackColor"] = value; }
}

[Category("自定义信息区")]
[DefaultValue(""), RefreshProperties(RefreshProperties.Repaint), Description("验证控件的字体大小"), NotifyParentProperty(true)]
public FontUnit ValidateFontSize
{
get
{

if (ViewState["ValidateFontSize"] != null)
return (FontUnit)ViewState["ValidateFontSize"];
return FontUnit.Point(10);
}
set { ViewState["ValidateFontSize"] = value; }
}

[Category("自定义信息区")]
[DefaultValue("false"), RefreshProperties(RefreshProperties.Repaint), Description("验证控件的字体加粗"), NotifyParentProperty(true)]
public bool ValidateFontBold
{
get
{

if (ViewState["ValidateFontBold"] != null)
return (bool)ViewState["ValidateFontBold"];
return false;
}
set { ViewState["ValidateFontBold"] = value; }
}

[Category("自定义信息区")]
[DefaultValue("false"), RefreshProperties(RefreshProperties.Repaint), Description("验证控件的字体斜体"), NotifyParentProperty(true)]
public bool ValidateFontItalic
{
get
{

if (ViewState["ValidateFontItalic"] != null)
return (bool)ViewState["ValidateFontItalic"];
return false;
}
set { ViewState["ValidateFontItalic"] = value; }
}

[Category("自定义信息区")]
[DefaultValue("false"), RefreshProperties(RefreshProperties.Repaint), Description("验证控件的字体上划线"), NotifyParentProperty(true)]
public bool ValidateFontOverLine
{
get
{

if (ViewState["ValidateFontOverLine"] != null)
return (bool)ViewState["ValidateFontOverLine"];
return false;
}
set { ViewState["ValidateFontOverLine"] = value; }
}

c11_11_11 2008-12-12
  • 打赏
  • 举报
回复
请试用ajaxtoolkit 中的autocomplete 控件
wuyq11 2008-12-12
  • 打赏
  • 举报
回复
重写textbox属性和事件
参考
http://www.cnblogs.com/honliv/articles/809353.html
http://www.cnblogs.com/admin11/articles/1259577.html
colincat2004 2008-12-12
  • 打赏
  • 举报
回复
奇怪,为什么不用combobox来实现?那样更为方便吧?什么下拉效果和从数据库查出来的匹配项不都有地方显示了?
cyqlightrain 2008-12-12
  • 打赏
  • 举报
回复
呵呵,你有想法.
大部分见过的都是用Div模拟出来的效果!像google的search.

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧