【问题标题】:Argument Out Of Range Exception when setting combobox 'Droppeddown' value to false将组合框“下拉”值设置为 false 时出现参数超出范围异常
【发布时间】:2016-12-14 17:14:32
【问题描述】:

我有一个用于搜索数据库的组合框。下拉列表将显示用户正在搜索的内容是否有匹配的项目,如果没有,它将收回。但是,当我的代码将 DroppedDown 值更改为 False 时,我会立即收到“ArgumentOutOfRangeException”。

该错误还包括“附加信息:InvalidArgument='0' 的值对'index' 无效。”

我不确定发生了什么,因为这是我第一次尝试使用组合框并自动更新它们。

'Search box - Text Update Event
    Private Sub searchBoxCB_TextUpdate(sender As Object, e As EventArgs) Handles searchBoxCB.TextUpdate
        'Begin search when user types

        searchBoxCB.Items.Clear()

        'Check if search has numbers in it
        Dim letters() As Char = searchBoxCB.Text
        Dim noNumbers As Boolean = True

        For Each c As Char In letters

            If (IsNumeric(c)) Then

                noNumbers = False

            End If

        Next

        'Only search if no numbers
        If (noNumbers) Then

            searchDataPerson(searchBoxCB.Text, "Person1")
            searchDataPerson(searchBoxCB.Text, "Person2")

        End If

        searchBoxCB.SelectionStart = searchBoxCB.Text.Length + 1 'Move cursor to end

        Cursor.Current = Cursors.Default

    End Sub

    'Search PERSON operation
    Private Sub searchDataPerson(input As String, person As String)

        Dim itemAdded As Boolean = False

        myConnection.Open()

        Dim str As String = "SELECT * FROM AllEmployeeDirectory WHERE " + person + " Like """ + input + "%""" 'Searches for NAMES beginning with input
        Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection) '*
        dr = cmd.ExecuteReader '*

        'Reads through all data
        While dr.Read

            searchBoxCB.DroppedDown = True
            searchBoxCB.Items.Add(dr(person) + " - " + dr("Desk"))
            itemAdded = True

        End While

        If (Not itemAdded) Then

            searchBoxCB.DroppedDown = False 'ERROR OCCURS HERE

        End If

        myConnection.Close()

    End Sub

【问题讨论】:

  • 我感觉这可能是您的操作顺序。由于您没有发布任何内容,因此我无法确认。
  • 我对扎格勒先生的好感有好感。
  • 我对您将代码发布在外部网站上而不是作为您的问题的一部分这一事实有一种不好的感觉。 :-(
  • 我刚开始使用 Stackoverflow,所以我对它的所有方面都不熟悉,抱歉。当我在做其他事情时,我必须快速获取代码。将尝试尽快将其放入问题中。
  • 好了,代码已添加到问题中:)

标签: vb.net visual-studio


【解决方案1】:

尽管有许多种变体,我还是无法让您的代码正常工作。

但是,我认为您打算通过将组合框设置为使用此代码使用自动完成功能:

Option Infer On

Public Class Form1

    Public Shared Function ACSC(s1 As String, s2 As String) As AutoCompleteStringCollection
        'TODO: substitute your query for obtaining the data here
        Dim a = {"A", "B", "AB", "CBA", "CB", "BC", "ABC"}

        Dim sc As New AutoCompleteStringCollection
        sc.AddRange(a.ToArray())

        Return sc

    End Function

    Private Sub searchBoxCB_TextChanged(sender As Object, e As EventArgs) Handles searchBoxCB.TextChanged
        Dim txt = DirectCast(sender, ComboBox).Text
        searchBoxCB.AutoCompleteSource = AutoCompleteSource.CustomSource
        searchBoxCB.AutoCompleteCustomSource = ACSC(txt, "")

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        searchBoxCB.AutoCompleteMode = AutoCompleteMode.SuggestAppend

    End Sub

End Class

a 上的 .ToArray() 以防万一 a 恰好是 LINQ 方法。)

信用:how List become AutoCompleteStringCollection

【讨论】:

  • 这个“有效”,但我更希望下拉菜单实际下拉,让用户点击一个项目。如果我可以让用户从下拉列表中选择,我在选择和项目后执行该功能的方式会容易得多。
  • 我将完整模式更改为 Suggest 而不是 append,它可以满足我的要求,不确定是否可以获得建议的索引,但我会尝试。
  • 我同意它不如您尝试使其工作的方式那么好,但如果有多个选择,至少它会显示一个下拉列表。即使我将行 searchBoxCB.DroppedDown = False 'ERROR OCCURS HERE 包裹在 Try..Catch 中并忽略异常,当它到达 searchBoxCB.SelectionStart = searchBoxCB.Text.Length + 1 时仍然会出错。
  • 我尝试将 AutoCompleteSource 更改为 ListItems 并将样式更改为 DropDown,我认为它可能会起作用。我只实现了测试数据,所以我现在将尝试实际搜索数据库。
【解决方案2】:

经过一些令人沮丧的实验后,我开始实现原始代码的简单解决方案。我没有做searchBoxCB.DroppedDown = False,而是把它改成了searchBoxCB.DropDownHeight = 1,它实际上做了同样的事情。然后我还将高度重置回 65,其中 DroppedDown 值设置为 true。它现在按预期工作,不敢相信我以前没有想到这个解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多