【问题标题】:Need Suggestions For AutoSuggest For VB.NET ComboBox需要 AutoSuggest For VB.NET ComboBox 的建议
【发布时间】:2017-02-10 05:36:36
【问题描述】:

为了提供一些上下文,我有一个组合框,用户可以与之交互以选择保险公司。不幸的是,它们不仅仅需要名称。有时保险公司名称相同,区分它们的唯一方法是使用它们的地址(例如,北卡罗来纳州的医疗保险办公室与南卡罗来纳州的医疗保险办公室)。我目前所做的是使用组合框的 DrawItem 事件在显示下拉列表时在 ComboBox 旁边绘制一个工具提示。列表本身显示保险公司名称,但工具提示将显示当前选定公司的地址。组合框设置为 DropDownList,因此除了列表中的内容外,他们无法选择任何内容。

好吧,现在我被告知要更改此设置。用户不再满足于必须单击组合框或按箭头键。他们需要可以输入的组合框,并在输入时显示自动建议列表。这一切都很好,但这是我遇到的问题。我使用工具提示的可爱小方案在这种情况下不起作用,因为自动建议列表是一个完全独立的控件。 DrawItem 没有触及它,我找不到自定义绘制自动建议列表的方法。另一个问题是 autosuggest 不会重复输入,所以即使我有两家不同的保险公司,也只有一家会出现在列表中,因为它们的名称相同。

到目前为止,我唯一的另一个想法是在用户按下某个键时以某种方式将下拉列表滚动到适当的项目。但是我不知道如何在不设置 selectedindex.js 的情况下在下拉列表中设置突出显示的项目。如果我使用 selectedindex,它会继续并替换文本。

有人对如何进行有任何建议吗?我是在正确的轨道上,还是我太努力了,需要完全做其他事情?

【问题讨论】:

  • 这是一个窗体应用程序还是一个网站?

标签: vb.net combobox autosuggest


【解决方案1】:

您可以在用户输入文本的地方使用文本字段,并据此缩小下拉框中的选择范围。为了解决同名但不同公司的问题,您可以在括号中的名称后面列出公司的地址。如果用户输入的名称无效,请在文本字段旁边放置一个错误/警告图标。

要在运行时更新选择,您可以在文本字段中添加一个事件侦听器并查询当前文本以确定它是否是有效的前缀。

【讨论】:

  • 在我的代码中的其他地方之前,我实际上已经尝试过这些方面的一些东西,并且取得了相当大的成功。唯一的问题是我可能会被要求保留组合框功能,以适应想要或喜欢使用该方法的用户。
  • 我看不出你提到的组合框功能问题出在哪里
  • 没有问题,我只是在想,一旦用户通过建议框做出选择,我就必须循环返回下拉列表并将 selectedindex 设置为任何选择用户制作。但现在我想起来,这真的很重要吗?一旦他们做出选择,他们就不太可能更改它,即使他们这样做,如果所选索引不是最新的,也不会造成巨大损失。我想我只是想多了。
【解决方案2】:

我们在我所在的公司做类似的事情。为此,我们通过 AJAX 使用 Web 服务。

本质上,您使用 AJAX AutoCompleteExtender (ACE) 修改标准文本框。这个 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

很酷的是,您可以通过“您的硬编码列表”故意添加值,该列表将与您通过网络服务提取的任何值相结合。这样,如果您无法向数据库添加值,您可以直接添加值。

【讨论】:

  • 很遗憾,这不是一个基于 Web 的应用程序,而是一个桌面程序。
  • Matt, Bummer...哈哈,也许这会对你有所帮助:codeproject.com/Tips/364616/…
  • 这让我想知道...... VB.NET 是一个糟糕的选择吗?我是那个打电话的人。我正在从程序的旧源代码(在 VB6 中)进行转换。因此,我认为转到 VB.NET 将是一个合乎逻辑的进展,但也许我应该完全用 C++ 或 Java 或其他东西来完成它?
  • codeproject 中的建议不起作用吗?你知道,在学术界,我是 C++ 的坚定支持者(并且仍然支持学术/关键任务程序),但对于商业应用程序呢? .Net 很棒。我觉得你选择的语言没问题。
  • 遗憾的是,它对我的​​目的并不是特别有用。我在问 VB.NET 是否是一个不错的选择,因为如果我将其构建为 Web 应用程序,它似乎会是一个更好的选择。
猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多