2

I need to make a custom TextBox, which takes text or numbers. After PostBack I want to check the value, and if it's not numbers - white a span behind TextBox with words "Not Digits!". I made a property Number, which checks the value, and if all ok - put it into viewstate, else, write string "Not Digits!". Here the code:

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);
    }
}
}

The question: As you can see, I can get the value writen in TextBox only from Text property. Is there any way to write the code, which will set value not to Text, but to my property Number? And how to make shown not Text property but Number?

4

1 回答 1

4

是的,您需要重写TextBox'LoadPostData方法,该方法实际上来自实现IPostBackDataHandler. 这发生在页面生命周期的早期,实际上控件从那里获取其Text属性。

在那里,您可以直接从请求参数中获取值。

但是,由于您正在扩展文本框,因此您将始终拥有 text 属性。干净的版本意味着Control您自己扩展和执行输入渲染。您将完全放弃该Text财产并仅保留您的Number财产。

代码会更干净,更容易阅读。但这当然意味着更多的工作。请注意,如果您Control直接扩展,则需要实现IPostBackDataHandler. 该界面基本上告诉页面您的控件发回数据并且需要以不同方式处理。

于 2013-05-27T16:51:51.680 回答