我需要创建一个自定义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,而是设置我的属性Number?如何使显示不是文本属性而是数字?
答案 0 :(得分:4)
是的,您需要覆盖TextBox
的{{1}}方法,该方法实际上来自实施IPostBackDataHandler
。这发生在页面生命周期的早期,实际上控件获取其LoadPostData
属性。
在那里,您可以直接从请求参数中跳入并获取值。
但是,由于您要扩展文本框,因此您将始终拥有text属性。干净的版本意味着扩展Text
并自己进行输入渲染。您将完全删除Control
属性并仅保留您的Text
属性。
代码更清晰,更容易阅读。但它当然意味着更多的工作。请注意,如果您直接展开Number
,则需要实施Control
。该界面基本上告诉页面您的控件将数据发回,并且需要以不同方式处理。