2012-04-13 6 views
1

일부 컨텍스트를 제공하기 위해 사용자가 보험 회사를 선택하기 위해 상호 작용하는 콤보 상자가 있습니다. 불행히도 그들은 단지 이름 만 필요로하지 않습니다. 때로는 보험 회사가 동일한 이름을 가지고 있으며 이들을 구별하는 유일한 방법은 주소를 사용하는 것입니다 (예 : 노스 캐롤라이나의 메디 케어 사무소 대 사우스 캐롤라이나의 메디 케어 사무소). 현재 내가 한 것은 콤보 상자의 DrawItem 이벤트를 사용하여 드롭 다운 목록이 표시 될 때 ComboBox 옆에 툴팁을 그립니다. 목록 자체에는 보험 회사 이름이 표시되지만 툴팁에는 현재 선택한 회사의 주소가 표시됩니다. 콤보 박스는 DropDownList로 설정되어 있기 때문에 목록에있는 항목 이외의 내용을 선택할 수는 없습니다.VB.NET ComboBox 용 AutoSuggest에 대한 제안 필요

글쎄, 지금 나는 이것을 바꾸라고 말하고있다. 사용자는 더 이상 콤보 상자를 클릭하거나 화살표 키를 누르지 않아도됩니다. 그들은 입력 할 수있는 콤보 박스를 원하고 입력 할 때 autosuggest 목록을 표시해야합니다. 그것은 모두 좋고 좋지만 이것은 내가 벽을 뛰어 다니고있는 곳입니다. autosuggest리스트는 완전히 별개의 컨트롤이기 때문에 툴팁을 사용하는 아주 귀여운 계획은 그 상황에서는 작동하지 않습니다. DrawItem은 그것을 만지지 않으며, autosuggest 목록을 사용자 정의 할 수있는 방법을 찾을 수 없습니다. 다른 문제는 autosuggest가 중복 된 항목을 작성하지 않는다는 것입니다. 따라서 두 개의 서로 다른 보험 회사가 있어도 동일한 이름을 공유하기 때문에 하나의 목록 만 나타납니다.

내가 지금까지 가지고 있었던 유일한 다른 생각은 사용자가 키를 누를 때 어떻게 든 적절한 항목으로 드롭 다운 목록을 스크롤하는 것입니다. 그러나 selectedindex를 설정하지 않고 드롭 다운 목록에서 강조 표시된 항목을 설정하는 방법을 알 수 없습니다. selectedindex를 사용하면 텍스트가 앞뒤로 바뀝니다.

진행 방법에 대한 제안이있는 사람이 있습니까? 나는 올바른 길을 가고 있습니까? 아니면 너무 열심히 노력하고 완전히 다른 것을 할 필요가 있습니까?

+0

Windows Forms 앱입니까, 웹 사이트입니까? – sacredfaith

답변

1

사용자가 텍스트를 입력 할 때 텍스트 입력란을 사용할 수 있으며이를 기반으로 드롭 다운의 선택 범위를 좁힐 수 있습니다. 같은 이름이지만 다른 회사 문제를 해결하기 위해 이름 뒤에 괄호 안에 회사의 주소를 나열 할 수 있습니다. 사용자가 유효하지 않은 이름을 입력하면 텍스트 필드 옆에 오류/경고 아이콘을 표시하십시오.

런타임에 선택 사항을 업데이트하려면 텍스트 필드에 이벤트 수신기를 추가하고 현재 텍스트를 쿼리하여 올바른 접두사인지 여부를 결정할 수 있습니다.

+0

필자는 실제로 코드 내 다른 곳에서이 행을 따라 뭔가를 시도해 보았습니다. 꽤 좋은 결과를 얻었습니다. 유일한 문제는 내가 그 방법을 사용하기를 원하거나 선호하는 사용자를 수용하기 위해 콤보 박스 기능을 남겨달라고 요청할 수도 있다는 것입니다. – MattM

+0

내가 언급 한 콤보 상자 기능에 문제가있는 부분이 보이지 않는다. – Attila

+0

문제가되지 않는다. 사용자가 제안 상자를 통해 선택을 한 후에 다시 돌아 가야한다고 생각했다. 드롭 다운 목록 및 selectedindex를 사용자가 선택한 선택 항목으로 설정합니다. 그러나 이제 나는 그것에 대해 생각한다. 그게 정말로 중요한 것인가? 일단 선택을하면 변경하지 않을 것이며, 그렇게하더라도 선택한 색인이 최신이 아닌 경우 큰 손실이 발생하지 않습니다. 제 생각 엔 그냥 지나친 것 같아요. – MattM

1

우리 회사와 비슷한 일을합니다. 이를 위해 AJAX를 통해 웹 서비스를 활용합니다.

기본적으로 AJAX AutoCompleteExtender (ACE)를 사용하여 표준 텍스트 상자를 수정합니다. 이 에이스는 고객이 직접 입력하는 정보를 가져 오는 웹 서비스 (내가 설명 할 것입니다)를 참조합니다. 일단 시작되고 실행되면 멋지다. 미묘한

<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> 

뭔가

의 .ascx은 당신이 당신의 자동 완성 확장에 대한 컨텍스트 키를 설정뿐만 아니라 당신의 웹 서비스에서 일부 기능을 만들 확인해야한다는 것입니다 : 여기

은 예입니다 값을로드하십시오 (다시 설명 하겠습니다).

된 .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는"필수 아니라는 것을. 이는 실제로 매개 변수로 전달하지 않고 웹 서비스에 더 많은 정보를 전달할 수있는 방법을 보여줍니다 (예 :콜론으로 구분 된 목록, 웹 서비스 기능이 SQL 문 등에서 사용할 수 있도록 구문 분석 할 수 있음). WebService에 대한 지금

(. 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'을 통해 값을 추가 할 수 있다는 것입니다. 이렇게하면 데이터베이스에 값을 추가 할 수없는 경우 직접 값을 추가 할 수 있습니다.

+0

불행히도이 프로그램은 웹 기반 응용 프로그램이 아니며 데스크톱 프로그램입니다. – MattM

+0

매트, 버머 ... 하하, 아마도 이것은 당신을 도울 것입니다 : http://www.codeproject.com/Tips/364616/Autosuggest-TextBox-from-database-column-in-Window – sacredfaith

+0

이것은 나를 궁금하다. VB.NET은 이것을하기에 좋지 않은 선택 이었는가? 나는 그 부름을 한 사람이었다. VB6에서 프로그램의 이전 소스 코드에서 변환 작업을하고 있습니다. 나는 VB.NET으로가는 것이 논리적 인 진행이 될 것이라고 생각했지만 어쩌면 내가 C++이나 Java 또는 다른 어떤 것으로 그것을해야만 했을까? – MattM