0

ASP.NET/C#のAutoCompleteExtenderを使用して、フィールドの主キーとともにデータベースからデータを取得しています。名前を選択すると、[送信]をクリックする前でも詳細(name / 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';
}

ただし、ユーザーがEnterキーを押したり、[送信]をクリックしたりしても、リセットされません。彼らが1、2秒クリックしない場合、それは機能し、隠しフィールドを0にリセットします。

他のアイデアはありますか?

4

2 に答える 2

5

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" 
于 2012-02-20T07:23:39.150 に答える
0

$ addHandlerを使用して、テキストボックスのkeypressイベントにアタッチしてみてください。そのイベントハンドラーの非表示フィールドをクリアします。

$addHandler($get("txtName"), "keypress", function(e) {
    $get("txtName_hidden").value = "";
}, true);
于 2010-10-28T10:46:44.760 に答える