1

コンテキストを提供するために、ユーザーが保険会社を選択するために操作するコンボボックスを用意しました。残念ながら、名前だけが必要なわけではありません。保険会社が同じ名前を持っている場合があり、保険会社を区別する唯一の方法は住所を使用することです (たとえば、ノースカロライナ州のメディケア事務所とサウスカロライナ州のメディケア事務所)。私が現在行っていることは、コンボボックスの DrawItem イベントを使用して、ドロップダウン リストが表示されているときに ComboBox の横にツールチップを描画することです。リスト自体には保険会社の名前が表示されますが、ツールチップには現在選択されている会社の住所が表示されます。コンボボックスは DropDownList に設定されているため、リストにあるもの以外を選択することはできません。

今、私はこれを変更するように言われています。ユーザーは、コンボボックスをクリックしたり、矢印キーを押したりする必要がなくなりました。彼らは、入力できるコンボボックスと、入力時に自動提案リストが表示されることを望んでいます。それはそれでいいのですが、ここで壁にぶち当たります。自動提案リストは完全に独立したコントロールであるため、ツールチップを使用するという私のかわいいスキームは、そのような状況では機能しません。DrawItem はそれに触れておらず、autosuggest リストをカスタム描画する方法が見つかりません。もう 1 つの問題は、autosuggest はエントリを重複させないことです。そのため、2 つの異なる保険会社を持っていても、同じ名前を共有しているという理由だけで 1 つのみがリストに表示されます。

私がこれまでに持っていた他の唯一のアイデアは、ユーザーがキーを押したときにドロップダウンリストを適切な項目にスクロールすることです。しかし、selectedindex を設定せずにドロップダウン リストで強調表示された項目を設定する方法がわかりません。selectedindex を使用すると、テキストが置き換えられます。

続行する方法について何か提案はありますか?私は正しい方向に進んでいますか、それとも一生懸命頑張りすぎて、まったく別のことをする必要がありますか?

4

2 に答える 2

1

私がいる会社でも同じようなことをしています。それを実現するために、AJAXを介したWebサービスを利用しています。

基本的に、AJAX AutoCompleteExtender(ACE)を使用して標準のテキストボックスを変更します。このエースは、顧客がその場で入力した情報を取得するWebサービス(これについて説明します)を参照します。起動して実行すると、かなりクールです。

次に例を示します。

.ascx

<asp:TextBox ID="txtInsuranceCompany" runat="server" TabIndex="520" 
      AutoComplete="Off"AutoCompleteType="Disabled" CssClass="asbSearch" Width="350px"></asp:TextBox>
<ajax:AutoCompleteExtender ID="aceInsuranceCompany" runat="server" CompletionSetCount="20"
       MinimumPrefixLength="0" OnClientShown="resetPosition" ServiceMethod="LookupData"
       ServicePath="~/WebLookUpService.asmx" TargetControlID="txtInsuranceCompany" UseContextKey="true">
</ajax:AutoCompleteExtender>

微妙な点は、オートコンプリートエクステンダーのコンテキストキーを設定し、Webサービス内に値をロードするための機能を作成する必要があることです(ここでも説明します)。

.vbコードビハインド

 Dim yourhardcodedlist As New List(Of String)
 yourhardcodedlist.Add("Progressive")
 yourhardcodedlist.Add("State Farm")
 yourhardcodedlist.Add("USAA")
 WebLookUpService.AddLookupValues(txtInsuranceCompany.ID, yourhardcodedlist.ToArray)
 aceInsuranceCompany.ContextKey = public_var0 & ":" & public_var1 & ":" & txtInsuranceCompany.ID

「public_var0」と「public_var1」は必須ではないことに注意してください。これは、実際にパラメーターとして渡さずに、より多くの情報をWebサービスに渡す方法を示しています(つまり、Webサービス関数がSQLステートメントなどで使用するために解析できるコロン配信リスト)。

Webサービスの場合...(。asmx)

<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<System.Web.Script.Services.ScriptService()> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class WebLookUpService
    Inherits System.Web.Services.WebService

    <System.Web.Services.WebMethod(), System.Web.Script.Services.ScriptMethod()> _
    Public Function LookupData(ByVal prefixText As String, ByVal count As Integer,  ByVal contextKey As String) As String()
    'Construct SQL statement to pull from database
    'parsing the context key as necessary to construct your SQL statement (if necessary)
    'Dim somethingForSql As String = contextKey.Split(":")
    Dim suggestions As List(Of String) = New List(Of String)

    Try

        Using cnADO As SqlConnection = New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("PublicSafetyServer").ToString)
            cnADO.Open()

            Dim dt As DataTable = New DataTable
            Dim da As New SqlDataAdapter
            da.SelectCommand = New SqlCommand("<YourSQLStatement>")         

            da.Fill(dt)

            Dim endRow As Integer = dt.Rows.Count
            If endRow > count Then
                endRow = count
            End If

            For i As Integer = 0 To endRow - 1
                Dim des As String = dt.Rows(i).Item(field)
                Dim val As String = dt.Rows(i).Item(field)
                suggestions.Add(AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem(des, val))
            Next
        End Using

    Catch ex As Exception
        'Throw Error
    End Try

    suggestions.Sort()
    If suggestions.Count = 0 Then
        suggestions.Add(AjaxControlToolkit.AutoCompleteExtender.CreateAutoCompleteItem(noneFound, ""))
    End If
    Return suggestions.ToArray()
End Function

すばらしいのは、「yourhardcodedlist」を介して意図的に値を追加し、Webサービスを介して取得した値と組み合わせることができることです。このようにして、データベースに値を追加できない場合でも、値を直接追加できます。

于 2012-04-13T17:21:25.627 に答える
1

ユーザーがテキストを入力するテキスト フィールドを使用し、それに基づいてドロップボックスの選択を絞り込むことができます。同じ名前で異なる会社の問題を回避するには、名前の後に会社の住所を括弧で囲んでリストすることができます。ユーザーが無効な名前を入力した場合は、テキスト フィールドの横にエラー/警告アイコンを表示します。

実行時に選択内容を更新するには、イベント リスナーをテキスト フィールドに追加し、現在のテキストをクエリして、それが有効なプレフィックスかどうかを判断します。

于 2012-04-13T15:46:40.743 に答える