【问题标题】:Custom ASP.NET web control TextBox自定义 ASP.NET Web 控件 TextBox
【发布时间】:2013-05-27 16:43:06
【问题描述】:

我需要制作一个自定义文本框,它接受文本或数字。在 PostBack 之后,我想检查该值,如果它不是数字 - 在 TextBox 后面的白色跨度带有“Not Digits!”字样。我创建了一个属性 Number,它检查值,如果一切正常 - 将其放入视图状态,否则,写入字符串“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?以及如何使显示的不是文本属性而是数字?

【问题讨论】:

    标签: c# asp.net web-controls


    【解决方案1】:

    是的,你需要重写TextBoxLoadPostData方法,它实际上来自于实现IPostBackDataHandler。这发生在页面生命周期的早期,实际上控件从那里获取其Text 属性。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 2011-06-15
      相关资源
      最近更新 更多