自定义控件中的AutoCompleteExtender

时间:2013-02-10 06:30:38

标签: c# asp.net custom-controls ajaxcontroltoolkit autocompleteextender

我有一个带动态创建文本框的复合用户控件。在创建文本框并将其插入ASCX上的占位符时,我还会动态创建一个AutoCompleteExtender,以刚刚创建的文本框为目标。如果我只添加一个ACE,一切正常,但只要页面上有多个ACE,我就会收到以下错误:

  

Microsoft JScript运行时错误:无法获取属性'_behaviors'的值:object为null或undefined

这是jQuery中包含的JScript错误的具体位置。

  

var c = a._behaviors = a._behaviors || [];

如果我在页面上创建虚拟文本框和ACE,则相同的代码可以正常工作。但我需要在自定义控件中创建这些。

这表明我“做得对” - 而且,因为我可以让一个ACE在控制中正常工作。

我正在使用网络服务 - 不是页面方法 - 我意识到用户和自定义控件不能包含页面方法,这些方法必须位于“页面”中。

我尝试了很多东西 - 我确保文本框都有唯一的ID。 ACE都有唯一的ID。我已尝试使用和不在ACE上定义ACE(再次使用唯一ID)。我知道Web服务有效,因为单个ACE运行良好。

我甚至尝试将生成的ACE列表从控件传递到页面级别,然后将它们插入到页面级占位符中。然后我得到RTE,找不到提供ID的文本框。

使用动态生成的文本框和扩展程序在复合用户控件中添加多个ACE的任何提示?

问候。

1 个答案:

答案 0 :(得分:0)

这对我有用:

public partial class multiACEfromCodeBehind : System.Web.UI.Page
{
    public override void VerifyRenderingInServerForm(Control control)
    {
        /* Confirms that an HtmlForm control is rendered for the specified ASP.NET
           server control at run time. */
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {   
            for(int i = 0; i < 10; i++)
            {
                // Create TextBox and its properties
                string textBoxID = String.Format("{0}_{1}", "AutoCompleteTextBox", i);
                TextBox textbox = new TextBox();
                textbox.ID = textBoxID;
                textbox.Width = new Unit(250);
                textbox.Attributes.Add("autocomplete", "off");

                // Create AutoCompleteExtender and its properties
                AutoCompleteExtender autoCompleteExtender = new AjaxControlToolkit.AutoCompleteExtender();
                autoCompleteExtender.TargetControlID = textBoxID;
                autoCompleteExtender.ServiceMethod = "GetCompletionList";
                autoCompleteExtender.ServicePath = "YourAutoCompleteWebService.asmx";
                autoCompleteExtender.CompletionInterval = 1500;
                autoCompleteExtender.CompletionSetCount = 10;
                autoCompleteExtender.EnableCaching = true;

                // Add created controls to the page controls collection
                this.Controls.Add(textbox);
                this.Controls.Add(autoCompleteExtender);
            }
        }
    }
}