3

我在 Visual Studio 2010 中有一个 winforms 应用程序。

在一个表单上,我有一个数据绑定组合框,为此我设置了 autocompletesource=listitems 和 autocompletemode=suggestappend。

现在为了让这个功能起作用,我设置了 dropdownstyle=dropdown,这样用户就可以输入一个文本

但我希望用户能够从其下拉列表中仅选择一个可用的项目。

如果用户输入列表项以外的项目并离开组合框,则用户不应离开组合框。

简而言之,我希望用户只能从可用的列表项中选择项目,而不是他输入的任何内容。

请帮助

4

6 回答 6

6

如果您设置DropDownStyle = DropDownListAutoCompleteMode = Append,用户仍然可以键入值来选择他们想要的项目,但他们将被限制为列表中的项目。

AutoCompleteMode = Append,它会通过将它们附加到正在搜索的值中来检查随后键入的字符,只要您快速键入它们即可。如果您在击键之间等待的时间过长,那么它将再次返回到第一个字母搜索。

考虑一下:您是否真的需要他们能够输入无效值,以便提醒他们该值无效?因为如果不是,那只会更加混乱。通过让他们有机会输入任何值,这意味着他们被允许这样做。

于 2013-02-20T14:16:11.167 回答
3

将属性“DropDownStyle”设置为“DropdownList”,这将阻止用户输入组合。

希望这可以帮助。

于 2013-02-20T13:43:52.130 回答
1

我寻找一些解决方案,但没有使用限制 DropDownList (键入是时间有限的用户必须快速)。

以前的代码对我来说似乎很好,但在输入我们需要的内容时不会被调用。ComboBox 我切换到AutoCompleteMode = SuggestAppend, AutoCompleteSource = ListItems, DoprDownStyle = DropDown. 这允许用户直接输入框并且没有时间限制。

这是我的代码,希望对某人有所帮助:

Private Sub ComboBox1_KeyUp(sender As Object, e As KeyEventArgs) Handles ComboBox1.KeyUp
  If ComboBox1.Text <> String.Empty Then
    If ComboBox1.FindString(cboSkupina.Text) = -1 Then 'if is value -1 typed text is not in list
      ComboBox1.Text = Mid(ComboBox1.Text, 1, Len(ComboBox1.Text) - 1) 'Delete not valid character
      ComboBox1.SelectionStart = Len(ComboBox1.Text) + 1 'Place cursor at the end
    End If
  End If
End Sub
于 2017-07-28T05:45:42.227 回答
0

虽然同意之前的答案,但为了限制用户输入无效数据,明智的做法是选择DropDownStyle = ComboBoxStyle.DropDownList. 但万一你想要你想要的,你可以使用OnValidating控件的事件来检查列表项的有效值。或者更好的是,继承控件并在整个项目中使用它。这是我使用的代码。

Namespace Relax.Controls
    Public Class RelaxCombobox
        Inherits ComboBox

        Public Property RestrictContentToListItems As Boolean = True

        Public Sub New()
            With Me
                .AutoCompleteSource = Windows.Forms.AutoCompleteSource.ListItems
                .AutoCompleteMode = Windows.Forms.AutoCompleteMode.SuggestAppend
            End With
        End Sub

        Protected Overrides Sub OnValidating(e As System.ComponentModel.CancelEventArgs)
            If RestrictContentToListItems AndAlso Me.Items.Count > 0 Then
                 Dim index As Integer = Me.FindString(Me.Text)
                If index > -1 Then
                    Me.SelectedIndex = index
                Else
                    e.Cancel = True
                    Me.Text = ""
                    Beep()
                End If
            End If
           MyBase.OnValidating(e)
        End Sub
    End Class
End Namespace

请注意,不允许用户离开控件是一个糟糕的 UI 设计。

于 2013-07-15T05:18:03.260 回答
0

尝试以下操作:

Private Sub ComboBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.Leave
    If (ComboBox1.SelectedIndex = -1) Then
        ComboBox1.Focus()
    End If
End Sub
于 2016-03-26T16:02:46.097 回答
0

只需将以下代码段添加到ComboBox的KeyPress 事件中。请记住用您的名称替换组合框名称。

Private Sub ComboBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ComboBox1.KeyPress
        If e.KeyChar = ControlChars.Back AndAlso e.KeyChar = ControlChars.Back Then
            Return
        End If

        Dim t As String = ComboBox1.Text
        Dim typedT As String = t.Substring(0, ComboBox1.SelectionStart)
        Dim newT As String = typedT + e.KeyChar

        Dim i As Integer = ComboBox1.FindString(newT)
        If i = -1 Then
            e.Handled = True
        End If
End Sub
于 2017-09-05T16:39:23.380 回答