2009-12-08 94 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

相關問題