[英]Custom ASP.NET web control TextBox
我需要制作一个自定义TextBox,该文本框可以包含文本或数字。 在PostBack之后,我想检查值,如果不是数字,请在TextBox后面加一个空白,并用单词“ Not Digits!”代替。 我创建了一个属性Number,用于检查值,如果一切正常,则将其置于viewstate,否则,写入字符串“ Not Digits!”。 这里的代码:
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);
}
}
}
问题:如您所见,我只能从Text属性获得在TextBox中写入的值。 有什么办法可以编写代码,将值设置为“ Text”而不是“ Text”? 以及如何使显示的不是Text属性而是Number?
是的,您需要重写TextBox
的LoadPostData
方法,该方法实际上来自实现IPostBackDataHandler
。 这发生在页面生命周期的早期,实际上是从那里获取控件的Text
属性。
在那里,您可以直接从请求参数中获取值。
但是,由于要扩展文本框,因此将始终具有text属性。 干净的版本意味着扩展Control
并自己进行输入渲染。 您将完全删除Text
属性,并仅保留Number
属性。
该代码将更加简洁,并且易于阅读。 但是,这当然意味着要做更多的工作。 请注意,如果要直接扩展Control
,则需要实现IPostBackDataHandler
。 该界面基本上告诉页面您的控件回传了数据,因此需要以不同的方式进行处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.