[英]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.