簡體   English   中英

自定義ASP.NET Web控件TextBox

[英]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}&nbsp;</span><br />", notNumber);
        base.Render(writer);
    }

    protected override void RenderContents(HtmlTextWriter output)
    {
        output.Write(Number);
    }
}
}

問題:如您所見,我只能從Text屬性獲得在TextBox中寫入的值。 有什么辦法可以編寫代碼,將值設置為“ Text”而不是“ Text”? 以及如何使顯示的不是Text屬性而是Number?

是的,您需要重寫TextBoxLoadPostData方法,該方法實際上來自實現IPostBackDataHandler 這發生在頁面生命周期的早期,實際上是從那里獲取控件的Text屬性。

在那里,您可以直接從請求參數中獲取值。

但是,由於要擴展文本框,因此將始終具有text屬性。 干凈的版本意味着擴展Control並自己進行輸入渲染。 您將完全刪除Text屬性,並僅保留Number屬性。

該代碼將更加簡潔,並且易於閱讀。 但是,這當然意味着要做更多的工作。 請注意,如果要直接擴展Control ,則需要實現IPostBackDataHandler 該界面基本上告訴頁面您的控件回傳了數據,因此需要以不同的方式進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM