2

以下は私のコードです:

    Public Class Form1

Private DT_LocalTransactionList As DataTable

Private Sub DataGridView1_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter
    DT_LocalTransactionList = New DataTable
    DT_LocalTransactionList.Columns.Add("TransactionName")
    DT_LocalTransactionList.Columns.Add("TransactionType")
    For iVisible As Integer = 0 To 5
        DT_LocalTransactionList.Rows.Add()
        DT_LocalTransactionList.Rows(iVisible).Item("TransactionName") = "Name " & iVisible
        DT_LocalTransactionList.Rows(iVisible).Item("TransactionType") = "Add " & iVisible
    Next
    If e.ColumnIndex = colName.Index Then
        Dim dgvCbo As New DataGridViewComboBoxCell
        dgvCbo = TryCast(DataGridView1(colName.Index, e.RowIndex), DataGridViewComboBoxCell)
        dgvCbo.DataSource = DT_LocalTransactionList
        dgvCbo.DisplayMember = "TransactionName"
        dgvCbo.ValueMember = "TransactionType"
    End If
End Sub

Private Sub DataGridView1_EditingControlShowing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    Select Case Me.DataGridView1.CurrentCell.ColumnIndex

        Case colName.Index
            If TypeOf e.Control Is ComboBox Then
                Dim cb As ComboBox = TryCast(e.Control, ComboBox)
                cb.DropDownStyle = ComboBoxStyle.DropDown
                cb.AutoCompleteSource = AutoCompleteSource.ListItems
                cb.AutoCompleteMode = AutoCompleteMode.Suggest
                RemoveHandler cb.DrawItem, AddressOf GridCombo_DrawItem
                RemoveHandler cb.DropDownClosed, AddressOf cbDropDownClosed
                RemoveHandler cb.Validating, AddressOf GridCombo_Validating
                RemoveHandler cb.KeyDown, AddressOf GridCombo_KeyDown
                AddHandler cb.DrawItem, AddressOf GridCombo_DrawItem
                cb.DrawMode = DrawMode.OwnerDrawFixed
                AddHandler cb.DropDownClosed, AddressOf cbDropDownClosed
                AddHandler cb.Validating, AddressOf GridCombo_Validating
                AddHandler cb.KeyDown, AddressOf GridCombo_KeyDown
            End If
    End Select
End Sub

Private Sub GridCombo_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs)
    Dim text As String = sender.GetItemText(sender.Items(e.Index))

    e.DrawBackground()

    Using br As New SolidBrush(e.ForeColor)
        e.Graphics.DrawString(text, e.Font, Brushes.Black, e.Bounds)
    End Using

    e.DrawFocusRectangle()
End Sub

Private Sub cbDropDownClosed(ByVal sender As Object, ByVal e As System.EventArgs)

End Sub

Private Sub GridCombo_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
    Dim cb As ComboBox = TryCast(sender, ComboBox)

    If Not IsItemExistInList(cb) Then
        e.Cancel = True
    End If
End Sub

Private Sub GridCombo_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
    Dim cb As ComboBox = TryCast(sender, ComboBox)
    cb.Refresh()

    If e.KeyCode = Keys.Enter Then
        If IsItemExistInList(cb) Then
            System.Windows.Forms.SendKeys.Send("{TAB}")
        End If
    End If
End Sub

Public Function IsItemExistInList(ByRef cboCombo As ComboBox) As Boolean
    Dim blnContinue As Boolean
    Dim intCount As Integer

    blnContinue = False

    If cboCombo.Text.Trim = "" Then
        blnContinue = True
    End If

    If blnContinue = False Then
        For intCount = 0 To cboCombo.Items.Count - 1 And blnContinue = False
            If cboCombo.Text.Trim = cboCombo.GetItemText(cboCombo.Items(intCount)).Trim Then
                blnContinue = True
            End If
        Next
    End If

    IsItemExistInList = blnContinue
End Function

   End Class

datagridview のコンボボックス コントロールに「n」と入力すると、オートコンプリート機能のすべての値が表示され、いずれかを選択してタブを押すと、そのフィールドに選択した値が表示されません。2回目に同じことをすると、そこに正しい選択が表示されます。そのことを初めて実装する方法は?

4

1 に答える 1

1

CommitEdit指定された基準に従って編集コントロールが検証されたら、DataGridView のメソッドを確認する必要があります。

Private Sub GridCombo_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
    Dim cb As ComboBox = TryCast(sender, ComboBox)

    If Not IsItemExistInList(cb) Then
        e.Cancel = True
    Else
        DataGridView1.CommitEdit(DataGridViewDataErrorContexts.CurrentCellChange)
    End If
End Sub

この場合CommitEdit、提供されたサンプルはコレクションからの値のみを許可するため、メソッドによって返される値を無視できます。したがって、値が存在しない場合、セルは入力されません。

おすすめの読み物

DataGridViewComboBoxColumnまた、セルの値を編集するには2〜3回クリックする必要があることも経験しました。私は使用することをお勧めします:

DataGridView1.EditMode = DataGridViewEditMode.EditOnEnter

ある出発点で。上記のコード自体は、それが何をするかを詳しく説明しています。

于 2012-11-06T17:59:45.383 に答える