2

AjaxControlToolkitを使用しており、そのオートコンプリート拡張機能をテキストボックスにバインドしています。

元のコードを使用すると、完全に機能させることができます。私の要件は、1セットのデータをクエリして送信することから、そのデータをキーで送信する必要があることへと進化しました。

例:
ユーザーがテキストを入力すると、クエリは3つのテーブルで可能性を検索し、すべての結果を送り返します。これらの結果を、取得元のテーブルにバインドしたいと思います。
キーはエクステンダーに表示される必要はなく、値のみが表示されます。

私の考えは、結果を辞書にバインドし、それをループして値を取得し(値を文字列[]にバインドしてオートコンプリートに戻す)、キーを使用して、選択した変数が表示された別のテキストボックスに署名することでした。から。

現在のコード.aspx

<ajaxToolkit:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="txtMainSearch" ServiceMethod="GetCompletionList" CompletionInterval="500" FirstRowSelected="True" CompletionListCssClass="completionList" CompletionListItemCssClass="listItem" CompletionListHighlightedItemCssClass="itemHighlighted"></ajaxToolkit:AutoCompleteExtender>

.cs

[WebMethod, ScriptMethod]
public static string[] GetCompletionList(string prefixText)
{
    ArrayList srings = new ArrayList();

    int counter = 0;

    SqlConnection db = DataConn.SqlConnection();

    db.Open();
    SqlTransaction transaction = db.BeginTransaction();

    Dictionary<string, string> dictionary = new Dictionary<string, string>();

    try
    {
        SqlCommand command = new SqlCommand("[Table 1]" + prefixText + "[Var]", db, transaction);
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                counter = counter + 1;
                dictionary.Add("ItemOne", reader["something"].ToString());
            }
        }

        command = new SqlCommand("[Table 2]", db, transaction);
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                counter = counter + 1;
                dictionary.Add("ItemTwo", reader["something"].ToString());
            }
        }

        transaction.Commit();
    }
    catch (SqlException)
    {
        transaction.Rollback();
        dictionary.Add("Error", "Problem Getting Results");
    }

    if (counter == 0)
        dictionary.Add("Error", "There are no users to display");

    foreach (KeyValuePair<string, string> valuePair in dictionary)
    {
        srings.Add(valuePair.Value);
    }

    return null; //This isnt really null... Just accidently deleted the code
}
4

1 に答える 1

1

主な問題は、重複するキーを辞書に追加しようとしていることです。List<KeyValuePair<string, string>>代わりにコレクションを使用してください:

var values = new List<KeyValuePair<string, string>>();

// select data from first table
foreach (var id in Enumerable.Range(1,10))
{
    values.Add(new KeyValuePair<string,string>("Table1_" + id.ToString(), Guid.NewGuid().ToString() );
}

//select data from the second table
foreach (var id in Enumerable.Range(1,10))
{
    values.Add(new KeyValuePair<string,string>("Table2_" + id.ToString(), Guid.NewGuid().ToString() );
}

if(values.Count == 0)
{
    values.Add(new KeyValuePair<string,string>("", "There are no users to display"));
}

return values.Select( pair => AutoCompleteExtender.CreateAutoCompleteItem(pair.Value, pair.Key)).ToArray();

ソーステーブル名とキー値自体から生成されたアイテムのキーに注意してください。

次に、ページでAutoCompleteExtenderOnClientItemSelectedクライアントイベントハンドラーに追加し、フォームに非表示フィールドを追加して、選択したアイテムの値を保存します。

<script type="text/javascript">
     function itemSelected(sender, args) {
          $get("<%= AutoCompleteSelectedValue.ClientID %>").value = args.get_value();
     }
</script>

<ajaxToolkit:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="txtMainSearch"
     ServiceMethod="GetCompletionList" CompletionInterval="500" FirstRowSelected="True"
     CompletionListCssClass="completionList" CompletionListItemCssClass="listItem"
     CompletionListHighlightedItemCssClass="itemHighlighted"
     OnClientItemSelected="itemSelected">

<asp:HiddenField runat="server" ID="AutoCompleteSelectedValue" />

その後、AutoCompleteSelectedValue非表示フィールドから選択された値を取得して解析できます。

于 2012-09-26T13:15:17.677 に答える