Проблемы с AutoCompleteExtender - PullRequest
       11

Проблемы с AutoCompleteExtender

0 голосов
/ 28 октября 2010

Я использую AutoCompleteExtender в ASP.NET/C# для извлечения данных из моей базы данных вместе с первичным ключом поля.Когда имя выбрано, данные (имя / 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.

Есть еще идеи, ребята?

Ответы [ 2 ]

5 голосов
/ 20 февраля 2012

Можно установить для свойства OnClientPopulation расширителя автозаполнения AJAX значение 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" 
0 голосов
/ 28 октября 2010

Попробуйте использовать $ addHandler , чтобы прикрепить к событию нажатие клавиши текстового поля. Очистите скрытое поле в этом обработчике событий:

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