自定义ASP.NET Web控件TextBox

时间:2013-05-27 16:43:06

标签: c# asp.net web-controls

我需要创建一个自定义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,而是设置我的属性Number?如何使显示不是文本属性而是数字?

1 个答案:

答案 0 :(得分:4)

是的,您需要覆盖TextBox的{​​{1}}方法,该方法实际上来自实施IPostBackDataHandler。这发生在页面生命周期的早期,实际上控件获取其LoadPostData属性。

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

但是,由于您要扩展文本框,因此您将始终拥有text属性。干净的版本意味着扩展Text并自己进行输入渲染。您将完全删除Control属性并仅保留您的Text属性。

代码更清晰,更容易阅读。但它当然意味着更多的工作。请注意,如果您直接展开Number,则需要实施Control。该界面基本上告诉页面您的控件将数据发回,并且需要以不同方式处理。