以编程方式在复合控件中添加FilteredTextBoxExtender

时间:2009-12-08 08:48:22

标签: asp.net asp.net-ajax

我目前正在尝试在ASP.NET复合控件中添加FilteredTextBoxExtender,但我无法让它工作。

我在重写的CreateChildControls方法中有以下代码:

var textbox = new TextBox { ID = string.Format("{0}_textbox", ID);
var filteredTextBoxExtender = new FilteredTextBoxExtender { ID = string.Format("{0}_filter", ID), TargetControlID = textbox.ID, FilterType = FilterTypes.Numbers };

Controls.Add(textbox);
Controls.Add(filteredTextBoxExtender);

不知何故,当我查看测试页面的来源时看起来它是正确添加的,但它不会触发过滤

Sys.Application.add_init(function() {
$create(AjaxControlToolkit.FilteredTextBoxBehavior, {"FilterType":2,"id":"ctl00_testTextBox_testTextBox_filter"}, null, null, $get("ctl00_testTextBox_testTextBox_textBox"));
});

...

<input id="ctl00_testTextBox" name="ctl00$testTextBox$testTextBox_textBox" type="text" value="" id="ctl00_testTextBox_testTextBox_textBox" />

知道这里发生了什么,以及如何让它解雇过滤?

编辑: 我已经将其缩小到动态选择要渲染的控件的问题。如果我明确地渲染每个子控件,FilteredTextBoxExtender可以工作,但如果我不在复合控件中渲染其中一个子控件(标签控件),则不能工作

1 个答案:

答案 0 :(得分:1)

试试这个:

问题是文本框的ID。如果您检查生成的JavaScript,您可以感觉到,输入ID与指定的ID不同$get("ctl00_testTextBox_testTextBox_textBox")。所以你的代码不起作用。 您应该通过INamingContainer marker inerface标记复合控件。因此,复合控件的id与添加的文本框ID相结合,并生成唯一的标识。它解决了这个问题。

public class Foo : CompositeControl
{

    protected override void CreateChildControls()
    {
        var textbox = new TextBox { ID = "textbox" }
        var filteredTextBoxExtender = new FilteredTextBoxExtender { TargetControlID = textbox.ID, FilterType = FilterTypes.Numbers };

        Controls.Add(textbox);
        Controls.Add(filteredTextBoxExtender);
    }

}