AutoCompleteExtender 有时有效

Posted

技术标签:

【中文标题】AutoCompleteExtender 有时有效【英文标题】:AutoCompleteExtender works sometimes 【发布时间】:2010-09-28 15:26:13 【问题描述】:
    [System.Web.Services.WebMethod]
    [System.Web.Script.Services.ScriptMethod]
    public string[] GetRowsByFilter(string prefixText, int count)
    //public static List<string> GetRowsByFilter(string prefixText)
    
        DataTable table = ds.Tables[0];
        string filter = "stShortName LIKE '" + prefixText.Replace("'", "''") + "%'";
        DataRow[] foundRows;
        List<string> items = new List<string>(count);

        foundRows = table.Select(filter);
        if (foundRows.Length > 0)
        
             for (int i = 0; i < foundRows.Length; i++)
            
                items.Add((string)foundRows[i]["stShortName"]);
            
            return items.ToArray();
        
        else
        
            items.Add("No '" + prefixText + "' items found");
            return items.ToArray();
        
    

<ajaxToolkit:AutoCompleteExtender 
    id="AutoCompleteExtenderTxtSite" 
    BehaviorID="AutoCompleteEx"
    Runat="server" 
    Targetcontrolid="txtSiteASP"
    ServiceMethod="GetRowsByFilter"
    MinimumPrefixLength="1" 
    CompletionInterval="1000"
    EnableCaching="false"
    CompletionSetCount="10" 
    CompletionListCssClass="autocomplete_completionListElement" 
    CompletionListItemCssClass="autocomplete_listItem" 
    CompletionListHighlightedItemCssClass="autocomplete_highlightedListItem"
    DelimiterCharacters=";, :"
    ShowOnlyCurrentWordInCompletionListItem="true" 
  >
    <Animations>
        <OnShow>
            <Sequence>
                <OpacityAction Opacity="0" />
                <HideAction Visible="true" />
                <ScriptAction Script="
                    // Cache the size and setup the initial size
                    var behavior = $find('AutoCompleteEx');
                    if (!behavior._height) 
                        var target = behavior.get_completionList();
                        behavior._height = target.offsetHeight - 2;
                        target.style.height = '0px';
                    " />
                <Parallel Duration=".4">
                    <FadeIn />
                    <Length PropertyKey="height" StartValue="0" EndValueScript="$find('AutoCompleteEx')._height" />
                </Parallel>
            </Sequence>
        </OnShow>
        <OnHide>
            <Parallel Duration=".4">
                <FadeOut />
                <Length PropertyKey="height" StartValueScript="$find('AutoCompleteEx')._height" EndValue="0" />
            </Parallel>
        </OnHide>
    </Animations>
</ajaxToolkit:AutoCompleteExtender>

其中大部分内容直接来自 Toolkit 示例网站。除了从数据库中填充数组外,我也完全按照示例中的方式使用 Web 服务完成了它。两者都完美地填充了数组,并且有时都可以工作。缺乏性能方面,它们似乎是相同的。

我在另一个页面上使用了几个日历控件,它们完美无缺,但浪费了太多时间试图使这项工作始终如一。

【问题讨论】:

【参考方案1】:

我发现如果服务器端代码执行时间过长,客户端AJAX请求似乎超时。

我没有尝试证明这一点,因为我可以通过调整服务器端代码来提高性能。

检查您的 DataSet 是否已缓存,如果没有,需要多长时间才能检索到它?检查数据库索引。 Sql LIKE 查询在 SQL Server 2005 中得到了更好的优化。

如果它不是超时并且实际上是服务器端错误,请通过浏览器访问 Web 服务并在“自动完成”文本框中键入要使用的查询,在本地测试 Web 服务。或者,在没有结果后检查服务器事件日志并查找 ASP.NET 警告事件。

【讨论】:

以上是关于AutoCompleteExtender 有时有效的主要内容,如果未能解决你的问题,请参考以下文章

在 OnClientItemSelected Javascript 函数中获取 AutoCompleteExtender 的 TargetControlId

Ajax AutoCompleteExtender文本框未在边缘浏览器中触发文本更改事件

不使用 AJAX AutoCompleteExtender 和 Web 服务的 ASP.Net 中的自动完成文本框

弹出自动完成时如何触发 JavaScript 函数?

为啥 UISearchDisplayController 有时有效,有时无效?

为啥使用 == 比较两个整数有时有效,有时无效? [复制]