Chris
Chris

Reputation: 7611

AutoCompleteExtender issues

I'm using an AutoCompleteExtender in ASP.NET/C# to retrieve data from my database, along with the primary key of the field. When a name is chosen, the details (name/pk) are retrieved even before clicking submit, and it then passes these onto a hidden field.

The issue I have is that if the user types in an incorrect name, the pk won't reset and will remain the same from the previous search - meaning that when the user clicks search, the old data will be displayed.

Here is my AutoComplete service:

 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();

    }

And the JavaScript used for populating the hiddenfield is:

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

What is the best way to reset the hiddenfield if no results are returned? I do currently have a 'part working' solution, which is this bit of 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';
}

But if the user hits enter/clicks submit very quickly, it doesn't reset. If they don't click for a second or two it works, and resets the hiddenfield to 0.

Any other ideas guys?

Upvotes: 0

Views: 2514

Answers (2)

user1121070
user1121070

Reputation: 89

You can set the OnClientPopulating property of the AJAX auto complete extender to a JS that clears the hidden field.

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" 

Upvotes: 5

Fr&#233;d&#233;ric Hamidi
Fr&#233;d&#233;ric Hamidi

Reputation: 262919

Try using $addHandler to attach to the keypress event of the text box. Clear your hidden field in that event handler:

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

Upvotes: 0

Related Questions