Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义ASP.NET web控件文本框_C#_Asp.net_Web Controls - Fatal编程技术网

C# 自定义ASP.NET web控件文本框

C# 自定义ASP.NET web控件文本框,c#,asp.net,web-controls,C#,Asp.net,Web Controls,我需要做一个自定义的文本框,它接受文本或数字。回发后,我想检查值,如果不是数字,则在文本框后面加一个空格,上面写着“不是数字!”。我制作了一个属性号,用于检查值,如果都正常,则将其放入viewstate,否则,写入字符串“notdigits!”。代码如下: namespace NumericTextBoxLibraryV2 { [DefaultProperty("Number")] [ToolboxData("<{0}:NumericTextBox runat=server><

我需要做一个自定义的文本框,它接受文本或数字。回发后,我想检查值,如果不是数字,则在文本框后面加一个空格,上面写着“不是数字!”。我制作了一个属性号,用于检查值,如果都正常,则将其放入viewstate,否则,写入字符串“notdigits!”。代码如下:

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);
    }
}
}
名称空间NumericTextBoxLibraryV2
{
[默认属性(“编号”)]
[ToolboxData(“”)
公共类NumericTextBox:TextBox
{
公共重写字符串文本
{
得到
{
返回base.Text;
}
设置
{
base.Text=值;
如果(!Int32.TryParse(值,输出编号))
notNumber=“仅限数字!”;
}
}
[可装订(真实)]
[类别(“外观”)]
//[默认值(“”)
//[可本地化(正确)]
公共整数
{
得到
{
if(ViewState[“Number”]==null)
{
ViewState[“Number”]=0;
}
数字=(int)视图状态[“数字”];
返回号码;
}
设置
{
Match Match=Regex.Match(value.ToString(),@“^\d+$”;
如果(匹配成功)
{
ViewState[“Number”]=值;
notNumber=string.Empty;
}
其他的
{
notNumber=“仅限数字!”;
}
}
}
私有整数;
私有字符串notNumber;
受保护的覆盖无效渲染(HtmlTextWriter编写器)
{
writer.Write(@“{0}
”,notNumber); base.Render(writer); } 受保护的覆盖无效渲染内容(HtmlTextWriter输出) { 输出。写入(数字); } } }

问题:如您所见,我只能从Text属性获取写在TextBox中的值。有没有办法编写代码,将值设置为我的属性号而不是文本?如何使显示的不是文本属性而是数字?

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

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

但是,由于要扩展文本框,因此始终具有text属性。一个干净的版本意味着扩展
控件
并自己进行输入渲染。您将完全删除
文本
属性,只保留
数字
属性


代码将更清晰,更易于阅读。当然,这意味着要做更多的工作。请注意,如果直接扩展
控件
,则需要实现
IPostBackDataHandler
。该接口基本上告诉页面,您的控件将数据发回,需要以不同的方式处理。

是的,您需要覆盖
文本框
加载postdata
方法,该方法实际上来自于实现。这发生在页面生命周期的早期,实际上控件从那里获得其
Text
属性

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

但是,由于要扩展文本框,因此始终具有text属性。一个干净的版本意味着扩展
控件
并自己进行输入渲染。您将完全删除
文本
属性,只保留
数字
属性

代码将更清晰,更易于阅读。当然,这意味着要做更多的工作。请注意,如果直接扩展
控件
,则需要实现
IPostBackDataHandler
。该接口基本上告诉页面您的控件将数据发回,需要以不同的方式处理