7

私は.NET Framework 4.0を使用してVBでVS 2010に取り組んでいます

私は持っていcomboboxます。その中にいくつかのアイテムがあり、うまく表示されます。ここで少し奇妙になります:

のドロップダウン矢印をcomboboxクリックして、必要なアイテムをクリックすると、「SelectedIndexChanged良い」と呼ばれます。

のテキスト領域内をクリックして、combobox選択したいものを入力し始め、上 (または下) キーを押して終了すると、SelectedIndexChanged- も良いと呼ばれます。

のドロップダウン矢印をクリックして、combobox選択したいものを入力し始め、Enter キーを押して終了すると、SelectedIndexChanged問題が呼び出されません。

ENTER最後のケースによって引き起こされる別のイベントはありますか? TextChangedとイベントを使用してみましたTextUpdateが、機能していないようです:

Private Sub cmbStatus_TextChanged(sender As System.Object, e As System.EventArgs) Handles cmbStatus.TextChanged
If e.Equals(Keys.Enter) Then
    Call SomeMethod()
End If

以外のものを使用する必要がありますe.Equals(Keys.Enter)か?

私が探すべき別のイベントはありますか?

編集: の項目の例は次のComboBoxとおりです。

  • 10 - 新規エントリーと完全性チェック ---> this is the most common type
  • 13 - TRB/HRB に割り当て ---> there are a few with '/'
  • 60 - 外部 (追って通知があるまで保留) ---> there are a few with '(' and ')'

基本的に、各リストのタイプは「## - SOME TEXT」です。

4

9 に答える 9

6

免責事項: これは C# で書かれています。VB に翻訳する必要がある場合はお知らせください。

private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    //It's important to also check that the Combo Box is displaying its Drop Down. If
    //you want this to execute even when it is not displayed, remove the check for
    //comboBox1.DroppedDown.
    if (e.KeyCode == Keys.Enter && comboBox1.DroppedDown &&
        !string.IsNullOrEmpty(comboBox1.Text))
    {
        int index;
        //Attempt to locate the string typed in by the user. An index of -1
        //means it was not found.
        if ((index = comboBox1.FindStringExact(comboBox1.Text)) != -1)
        {
            //Update the SelectedIndex.
            comboBox1.SelectedIndex = index;
        }
    }
}

興味深いことに、ユーザーが行った選択の変更を処理するときは、イベントではなくイベントを使用する必要があるとドキュメントに記載されています。この場合、私のアプローチを使用するとイベントが 2 回発生するため、そうする必要があります。SelectionChangeCommittedSelectedIndexChangedSelectedIndexChanged

編集:

ユーザーが文字列全体を入力する必要がないようにするには、Adi の回答からのアドバイスを使用します。コンボ ボックスのプロパティに移動し、set AutoCompleteModetoSuggestAppendAutoCompleteSourceto をListItems設定します。回答を作成するときにこれらの設定を実際に使用したので、うまくいくはずです。 .

于 2012-12-15T07:49:49.543 に答える
4
Option Strict On
Public Class Form1
    Friend WithEvents ComboBox1 As New ComboBox With {.Parent = Me}
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        ComboBox1.Items.AddRange({"hello", "tes1ted", "word", "item", "tes2ted"})
        ComboBox1.Text = ComboBox1.Items(0).ToString
    End Sub
    Private Sub ComboBox1_KeyUp(ByVal sender As Object, ByVal e As KeyEventArgs) Handles ComboBox1.KeyUp
        'You can put this in the keydown event, or adapt it a small bit and put it in the keypress event
        'putting it in the textchanged event is problematic and not recommended.
        Dim OriginalText As String = ComboBox1.Text
        If e.KeyCode = Keys.Enter Then
            If ComboBox1.SelectionLength > 0 Then
                ComboBox1.Text = ComboBox1.Text
                ComboBox1.SelectionLength = 0
                ComboBox1.SelectionStart = ComboBox1.Text.Length
            End If
        End If
        If Not IsTextKey(e.KeyCode) Then Exit Sub
        Dim Filter As String = ComboBox1.Text & "*"
        If Filter.Length = 1 Then Exit Sub
        For I = 0 To ComboBox1.Items.Count - 1
            If LCase(ComboBox1.Items(I).ToString) Like LCase(Filter) Then
                ComboBox1.SelectedItem = ComboBox1.Items(I)
                ComboBox1.Select(OriginalText.Length, (ComboBox1.Text.Length - OriginalText.Length))
                Exit Sub
            End If
        Next
    End Sub
    Function IsTextKey(ByVal Key As Integer) As Boolean
        Select Case True
            Case Key = Keys.Up : Return False
            Case Key = Keys.Down : Return False
            Case Key = Keys.Left : Return False
            Case Key = Keys.Right : Return False
            Case Key = Keys.Back : Return False
            Case Key = Keys.Delete : Return False
            Case Key = Keys.LWin : Return False
            Case Key = Keys.RWin : Return False
                'add whatever I missed
                'return false if the key either removes text from the textbox 
                'or does not produce a character
            Case Else
                'return true if the key produces a visible character(including space)
                Return True
        End Select
    End Function
End Class
于 2012-12-19T03:14:27.663 に答える
4
Private Sub ComboBox1_KeyUp(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyUp
    If e.KeyCode = Keys.Enter Then
        MessageBox.Show(ComboBox1.SelectedText)
        Call SomeMethod()
    End If
End Sub
于 2012-12-15T08:24:09.200 に答える
3

とに設定AutoCompleteModeする必要があると思います。このように、入力したものが ComboBox にロードされた項目で持続可能である場合、それを書き留めてその項目を見つけ、押されたときにが起動されます (一致が見つからなくても、リストの最初の項目)選ばれます)SuggestAppendAutoCompleteSourceListItemsEnterSelectedIndexChanged

これを指摘するために何かを用意しました。

よろしく、

アディ・コンスタンチン

于 2012-12-18T08:53:32.977 に答える
2

これがうまくいくかどうか教えてもらえますか?

    Private Sub ComboBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ComboBox1.KeyPress
      If e.KeyChar = Chr(13) Then
        ComboBox1_SelectedIndexChanged(sender, e)
      End If
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
      MsgBox(ComboBox1.Text)
      'Your code here
    End Sub
于 2012-12-17T01:13:09.670 に答える
2

KeyPressed イベントをサブスクライブします。

Private Sub yourComboBox_KeyPressed(sender As System.Object, e As System.KeyPressedEventArgs) Handles yourComboBox.KeyPressed
    If e.KeyChar.Equals((char)Keys.Enter) Then
        Call SomeMethod()
End If
于 2012-10-05T17:05:03.913 に答える
2

これはあなたの問題に役立ちます

 Private Sub ComboBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyDown
    If e.KeyCode = Keys.Enter Then
        MsgBox("hello")'call some functions
    End If
End Sub
于 2012-10-09T04:24:09.140 に答える
0

PreviewKeyDown イベントでリストを手動で閉じます。

Private Sub cmbStatus_PreviewKeyDown(sender As ComboBox, e As PreviewKeyDownEventArgs) Handles cmbStatus.PreviewKeyDown
    If e.KeyCode = Keys.Enter Then sender.DroppedDown = False
End Sub
于 2014-03-28T11:18:05.530 に答える