2009-12-08 79 views
0

我正在尝试在ASP.NET复合控件中添加FilteredTextBoxExtender,但我无法使其工作。以编程方式在复合控件中添加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工作,如果我明确地呈现每个孩子的控制,但如果我不呈现在复合控件的子控件的一个(Label控件)

回答

1

试试这个:

的问题是文本框的id 。如果您检查生成的JavaScript,您可以感觉到,输入的ID与指定的ID不同,为$get("ctl00_testTextBox_testTextBox_textBox")。所以你的代码不起作用。 您应该通过INamingContainer标记接口标记您的复合控件。因此,复合控件的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); 
    } 

} 
+0

谢谢,但是INamingContainer是多余的,因为我的控件已经继承自CompositeControl。 我已经编辑了我的问题,提供了自发布后发现的更多信息 – 2009-12-08 12:11:48

+0

是的,'CompositeControl'已经实现了'INamingContainer'。我要编辑我的帖子。但是,我无法实现您问题的更新部分。 – 2009-12-08 15:11:07

+0

不记得问题在这里,所以我只是要关闭它。无论如何,感谢您的帮助 – 2010-12-03 12:18:24

相关问题