3

VisualStudio2010にWinFormsアプリケーションがあります。

フォームには、autocompletesource=listitemsとautocompletemode=suggestappendを設定したデータバインドコンボボックスがあります。

この機能を機能させるために、dropdownstyle = dropdownを設定して、ユーザーがテキストを入力できるようにしました。

ただし、ユーザーがドロップダウンから使用可能なアイテムのみを選択できるようにしたいと思います。

ユーザーがリストアイテム以外のアイテムを入力してコンボボックスを離れる場合、ユーザーはコンボボックスを離れることができないはずです。

つまり、ユーザーが入力したものではなく、使用可能なリストアイテムからのみアイテムを選択できるようにしたいのです。

plzヘルプ

4

6 に答える 6

6

とを設定DropDownStyle = DropDownListした場合AutoCompleteMode = Appendでも、ユーザーは値を入力して必要なアイテムを選択できますが、リストにあるアイテムに制限されます。

の場合AutoCompleteMode = Append、すばやく入力する限り、つまり、検索対象の値に追加して入力された後続の文字をチェックします。キーストロークの間隔が長すぎると、最初の文字の検索に戻ります。

考えてみてください。無効であることを警告できるようにするために、無効な値を入力できるようにする必要が本当にありますか?そうでなければ、それはそのようにもっと混乱するからです。彼らに任意の値を入力する機会を与えることによって、それは彼らがそうすることを許可されていることを意味します。

于 2013-02-20T14:16:11.167 に答える
3

プロパティ「DropDownStyle」を「DropdownList」に設定すると、ユーザーはコンボに入力できなくなります。

お役に立てれば。

于 2013-02-20T13:43:52.130 に答える
1

私はいくつかの解決策を探していますが、DropDownListを制限することはありません(入力は時間制限があり、ユーザーは迅速でなければなりません)。

以前のコードは私には良いようですが、必要なものを入力しているときに呼び出されません。AutoCompleteMode = SuggestAppendComboBox 、、、に切り替え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 に答える