【问题标题】:AutoCompleteExtender issues自动完成扩展程序问题
【发布时间】:2010-10-28 10:39:44
【问题描述】:

我在 ASP.NET/C# 中使用 AutoCompleteExtender 从我的数据库中检索数据以及字段的主键。选择名称后,即使在单击提交之前,也会检索详细信息(名称/pk),然后将这些信息传递到隐藏字段。

我遇到的问题是,如果用户输入了错误的名称,pk 将不会重置,并且会与之前的搜索保持一致——这意味着当用户单击搜索时,将显示旧数据。

这是我的自动完成服务:

 public string[] GetAutoComplete(string prefixText, int count)
    {

        string connection = ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString;
        string sql = "SELECT * FROM SageAccount WHERE Name LIKE @prefixText AND Customer = 1 AND SageID IS NOT NULL";
        SqlDataAdapter da = new SqlDataAdapter(sql, connection);
        da.SelectCommand.Parameters.Add("@prefixText", SqlDbType.VarChar, 50).Value = prefixText + "%";
        DataTable dt = new DataTable();
        da.Fill(dt);
        List<string> Names = new List<string>();
        foreach (DataRow dr in dt.Rows)
        {
            Names.Add(AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem(dr["Name"].ToString() + " (" + dr["SageID"].ToString() + ")", dr["ID"].ToString()));
        }

        return Names.ToArray();

    }

用于填充隐藏字段的 JavaScript 是:

function autoCompleteItemSelected(source, eventArgs) {
            var assocHiddenField = document.getElementById(source.get_id() + '_hidden');
            assocHiddenField.value = eventArgs.get_value();
        }

如果没有返回结果,重置隐藏字段的最佳方法是什么?我目前确实有一个“部分工作”的解决方案,就是这段 JavaScript:

   function pageLoad() {

    $find('txtName')._onMethodComplete = function(result, context) {


        $find('txtName')._update(context, result, false);
        webservice_callback(result, context);
    };


}
function webservice_callback(result, context) {
    var hiddenfield = document.getElementById('txtName_hidden');
    if (result == "")
        hiddenfield.value = '0';
}

但是如果用户非常快速地点击回车/点击提交,它不会重置。如果他们没有点击一两秒钟,它就会起作用,并将隐藏字段重置为 0。

大家还有什么想法吗?

【问题讨论】:

    标签: c# asp.net ajax autocompleteextender


    【解决方案1】:

    您可以将 AJAX 自动完成扩展器的 OnClientPopulating 属性设置为清除隐藏字段的 JS。

    function ClearHidden(source, eventArgs) {
            document.getElementById('<%=this.hdnUsrIdSel.ClientID%>').value = null;
    }
    
    <ajaxToolkit:AutoCompleteExtender ID="autoCompleteExtend" runat="server" 
            MinimumPrefixLength="1" ServiceMethod="GetCompletionList" 
            FirstRowSelected="true" 
            ServicePath="~/WebServices/Autocomplete.asmx" TargetControlID="txtUsers" 
            UseContextKey="True" CompletionSetCount ="10" 
            OnClientPopulating="ClearHidden" 
    

    【讨论】:

      【解决方案2】:

      尝试使用$addHandler 附加到文本框的keypress 事件。清除该事件处理程序中的隐藏字段:

      $addHandler($get("txtName"), "keypress", function(e) {
          $get("txtName_hidden").value = "";
      }, true);
      

      【讨论】:

      • 我正在考虑这一点,但我想到了他们开始输入的可能性,决定不搜索然后单击屏幕中的链接,例如 gridview 中的不同页面 - 如果发生这种情况,它会说没有帐户。
      • 刚刚使用您的解决方案进行了脑电波 - 如果我使用 onkeypress 擦除隐藏字段,那么当用户单击提交按钮时,我可以将会话设置为真 - 如果没有会话或页面加载时为假,然后使用旧数据。
      • 我想知道当用户全选并使用鼠标剪切时会发生什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多