繁体   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