覆盖文本属性以自动修剪文本框值

时间:2013-11-19 12:21:50

标签: c# asp.net textbox

我想覆盖文本框的Text属性,将其值设置为自动修剪。为此,我必须定义以下类:

public class TextBox : System.Web.UI.WebControls.TextBox
{
    public override string Text
    {
        get { return base.Text.Trim(); }

        //Automatically trim the Text property as it gets assigned
        set { base.Text = value.Trim(); }
    }
}

但问题是它不适用于设计页面(.aspx)中定义的TextBox,它只适用于动态创建的文本框。

我需要这样的代码,无论动态还是静态添加,都会返回所有TextBox的修剪值。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您应该创建一个自定义控件并为其指定一个不同的名称。

[DefaultProperty("Text")]
[ToolboxData("<{0}:TrimmedTextBox runat=server></{0}:TrimmedTextBox>")]
public class TrimmedTextBox : TextBox
{
    [Category("Appearance")]
    public override string Text
    {
            get { return base.Text.Trim(); }
            //Automatically trim the Text property as it gets assigned
            set { base.Text = value.Trim(); }
    }
}

在此之后,打开AssemblyInfo.cs并在底部添加以下行:

 //[assembly: TagPrefix("yournamespace", "aspCustom")]
 [assembly: TagPrefix("WebformsSandbox", "aspCustom")]
 //change "aspCustom" to the prefix of your choice!

在此之后,您的工具应该在设计时可用:

enter image description here

要在标记代码中调用Custom元素,请将其从工具箱中绘制到代码中或写入:

<aspCustom:TrimmedTextBox ID="TrimmedTextBox1" runat="server"></aspCustom:TrimmedTextBox>

<强> //修改 我在p.campbell找到了另一个有效的解决方案:Find all textbox control in a page

这样可以避免创建自定义元素。您所做的是在Extensions类中定义一个helper方法:

public static IEnumerable<Control> FindAll(this ControlCollection collection)
{
    foreach (Control item in collection)
    {
        yield return item;

        if (item.HasControls())
        {
            foreach (var subItem in item.Controls.FindAll())
            {
                yield return subItem;
            }
        }
    }
}

完成此操作后,您可以遍历页面上的所有文本框控件并修剪文本:

foreach (var t in this.Controls.FindAll().OfType<TextBox>())
{ 
    t.Text = t.Text.Trim();
}

您应该可以使用Where(t => t.Id.Contains("someValue")或任何您喜欢的内容进一步过滤此内容。

你认为更好的取决于你。