【问题标题】:Only select list items from combobox仅从组合框中选择列表项
【发布时间】:2013-02-20 13:36:09
【问题描述】:

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

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

现在,为了让这个功能发挥作用,我设置了 dropdownstyle=dropdown,以便用户可以输入文本

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

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

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

请帮忙

【问题讨论】:

  • 如果您设置了DropDownStyle = DropDownListAutoCompleteMode = Append,用户仍然可以键入值来选择他们想要的项目,但是他们将被限制在列表中的项目。你真的需要他们能够输入一个无效的值,以便你可以提醒他们它是无效的吗?因为如果不是这样,那只会更加混乱。通过让他们有机会输入任何值,这意味着他们被允许这样做。
  • @StevenDoggart,我试过这个,但如果用户输入多个字符,它就不起作用。它仅适用于第一个字符。如果用户按“A”,则将显示以“A”开头的第一个单词,但他将无法找到具有“A”之后的字符的项目。
  • @StevenDoggart,我希望用户能够输入多个字符,然后出现建议,然后他选择项目,但如果该项目不在列表中,他就不能离开组合框。跨度>
  • 这不是真的。如果您设置AutoCompleteMode = Append,它将检查通过追加键入的后续字符到正在搜索的值。只要您快速键入它们,就是这样。如果您在击键之间等待的时间过长,那么它将再次返回到第一个字母搜索。
  • 是的,如果输入速度很快,它就可以工作。谢谢@StevenDoggart

标签: vb.net


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

      以前的代码对我来说似乎不错,但在键入我们需要的内容时没有调用。组合框我切换到AutoCompleteMode = SuggestAppendAutoCompleteSource = ListItemsDoprDownStyle = 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
      

      【讨论】:

        【解决方案4】:

        虽然同意之前的答案,但为了限制用户输入无效数据,选择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 设计。

        【讨论】:

          【解决方案5】:

          尝试以下方法:

          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
          

          【讨论】:

          • also: Private Sub ComboBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ComboBox1.Validating If (ComboBox1.SelectedIndex = -1) Then e.Cancel = True End If End子
          【解决方案6】:

          只需将以下 sn-p 添加到 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
          

          【讨论】:

            猜你喜欢
            • 2013-12-04
            • 1970-01-01
            • 1970-01-01
            • 2012-11-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-23
            相关资源
            最近更新 更多