C# 自定义ASP.NET web控件文本框
我需要做一个自定义的文本框,它接受文本或数字。回发后,我想检查值,如果不是数字,则在文本框后面加一个空格,上面写着“不是数字!”。我制作了一个属性号,用于检查值,如果都正常,则将其放入viewstate,否则,写入字符串“notdigits!”。代码如下:C# 自定义ASP.NET web控件文本框,c#,asp.net,web-controls,C#,Asp.net,Web Controls,我需要做一个自定义的文本框,它接受文本或数字。回发后,我想检查值,如果不是数字,则在文本框后面加一个空格,上面写着“不是数字!”。我制作了一个属性号,用于检查值,如果都正常,则将其放入viewstate,否则,写入字符串“notdigits!”。代码如下: namespace NumericTextBoxLibraryV2 { [DefaultProperty("Number")] [ToolboxData("<{0}:NumericTextBox runat=server><
namespace NumericTextBoxLibraryV2
{
[DefaultProperty("Number")]
[ToolboxData("<{0}:NumericTextBox runat=server></{0}:NumericTextBox>")]
public class NumericTextBox : TextBox
{
public override string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
if(!Int32.TryParse(value, out number))
notNumber = "Digits only!";
}
}
[Bindable(true)]
[Category("Appearance")]
//[DefaultValue("")]
//[Localizable(true)]
public int Number
{
get
{
if(ViewState["Number"] == null)
{
ViewState["Number"] = 0;
}
number = (int)ViewState["Number"];
return number;
}
set
{
Match match = Regex.Match(value.ToString(), @"^\d+$");
if (match.Success)
{
ViewState["Number"] = value;
notNumber = string.Empty;
}
else
{
notNumber = "Digits only!";
}
}
}
private int number;
private string notNumber;
protected override void Render(HtmlTextWriter writer)
{
writer.Write(@"<span>{0} </span><br />", notNumber);
base.Render(writer);
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write(Number);
}
}
}
名称空间NumericTextBoxLibraryV2
{
[默认属性(“编号”)]
[ToolboxData(“”)
公共类NumericTextBox:TextBox
{
公共重写字符串文本
{
得到
{
返回base.Text;
}
设置
{
base.Text=值;
如果(!Int32.TryParse(值,输出编号))
notNumber=“仅限数字!”;
}
}
[可装订(真实)]
[类别(“外观”)]
//[默认值(“”)
//[可本地化(正确)]
公共整数
{
得到
{
if(ViewState[“Number”]==null)
{
ViewState[“Number”]=0;
}
数字=(int)视图状态[“数字”];
返回号码;
}
设置
{
Match Match=Regex.Match(value.ToString(),@“^\d+$”;
如果(匹配成功)
{
ViewState[“Number”]=值;
notNumber=string.Empty;
}
其他的
{
notNumber=“仅限数字!”;
}
}
}
私有整数;
私有字符串notNumber;
受保护的覆盖无效渲染(HtmlTextWriter编写器)
{
writer.Write(@“{0}
”,notNumber);
base.Render(writer);
}
受保护的覆盖无效渲染内容(HtmlTextWriter输出)
{
输出。写入(数字);
}
}
}
问题:如您所见,我只能从Text属性获取写在TextBox中的值。有没有办法编写代码,将值设置为我的属性号而不是文本?如何使显示的不是文本属性而是数字?是的,您需要重写
TextBox
的LoadPostData
方法,该方法实际上来自于实现。这发生在页面生命周期的早期,实际上控件从那里获得其Text
属性
在这里,您可以直接从请求参数中获取值
但是,由于要扩展文本框,因此始终具有text属性。一个干净的版本意味着扩展控件
并自己进行输入渲染。您将完全删除文本
属性,只保留数字
属性
代码将更清晰,更易于阅读。当然,这意味着要做更多的工作。请注意,如果直接扩展
控件
,则需要实现IPostBackDataHandler
。该接口基本上告诉页面,您的控件将数据发回,需要以不同的方式处理。是的,您需要覆盖文本框的加载postdata
方法,该方法实际上来自于实现。这发生在页面生命周期的早期,实际上控件从那里获得其Text
属性
在这里,您可以直接从请求参数中获取值
但是,由于要扩展文本框,因此始终具有text属性。一个干净的版本意味着扩展控件
并自己进行输入渲染。您将完全删除文本
属性,只保留数字
属性
代码将更清晰,更易于阅读。当然,这意味着要做更多的工作。请注意,如果直接扩展控件
,则需要实现IPostBackDataHandler
。该接口基本上告诉页面您的控件将数据发回,需要以不同的方式处理