VB .Net DataGridView ComboBox - Как вы ссылаетесь на текст, который еще не сохранен? - PullRequest
0 голосов
/ 01 июня 2018

Вот проблема:

У меня есть сетка данных, привязанная к пустому набору данных (обычно, если заказы не были завершены с последнего сеанса).Пользовательские ключи в jobNumber и deliveryDate попадают в первые 2 столбца, а затем, если у них есть настраиваемый адрес электронной почты, который необходимо использовать, они могут выбрать его в выпадающем списке (заполненном ранее использованными адресами в formLoad) или набрать новое письмо, еслиего не существуетПроблема в том, что если введенное электронное письмо не совпадает с адресом в списке, то оно удаляется на вкладке.

Я пробовал несколько разных вещей, чтобы получить доступ к показанному (набранному пользователем) значению, прежде чем оно будет стерто коммитом, но, похоже, не могу найти способ.Моя работа вокруг, как показано ниже ... Я в основном фиксирую нажатия клавиш в комбинированном ящике с помощью специального обработчика.Затем я добавляю его в список выпадающих списков и выбираю это значение.Работает нормально, но может запутаться в зависимости от того, как вы получаете доступ к списку.

Есть какие-нибудь мысли о попытке перехватить всю строку, введенную пользователем, до ее удаления коммитом?

Private Sub dGrid1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles dGrid1.EditingControlShowing
    If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then
        RemoveHandler e.Control.KeyDown, AddressOf cBox_KeyDown

        CType(e.Control, ComboBox).DropDownStyle = ComboBoxStyle.DropDown
        CType(e.Control, ComboBox).AutoCompleteSource = AutoCompleteSource.ListItems
        CType(e.Control, ComboBox).AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest

        holdThis = ""
        AddHandler e.Control.KeyDown, AddressOf cBox_KeyDown
    End If
End Sub

Private Sub cBox_KeyDown(sender As Object, e As KeyEventArgs)
    If e.KeyCode = Keys.Space Then
        e.SuppressKeyPress = True

        holdThis = holdThis.Substring(1)

        Dim cBoxCol As DataGridViewComboBoxColumn
        cBoxCol = dGrid1.Columns.Item(3)
        cBoxCol.Items.Add(holdThis)
        cBoxCol = dGrid1.Columns.Item(4)
        cBoxCol.Items.Add(holdThis)

        dGrid1.CurrentCell.Value = holdThis
        Dim iCol = dGrid1.CurrentCell.ColumnIndex
        Dim iRow = dGrid1.CurrentCell.RowIndex
        If iCol = dGrid1.Columns.Count - 1 Then
            If iRow < dGrid1.Rows.Count - 1 Then
                dGrid1.CurrentCell = dGrid1(0, iRow + 1)
            End If
        Else
            dGrid1.CurrentCell = dGrid1(iCol + 1, iRow)
        End If

        holdThis = ""
    Else
        If e.KeyCode = Keys.Back Then
            holdThis = Strings.Left(holdThis, holdThis.Length - 1)
        ElseIf e.KeyCode = Keys.ShiftKey And Keys.D2 Then
            holdThis = holdThis & "@"
        ElseIf e.KeyCode = Keys.OemPeriod Then
            holdThis = holdThis & "."
        Else
            If holdThis.Length > 1 Then
                If holdThis(holdThis.Length - 1) = "2" Then
                    holdThis = Strings.Left(holdThis, holdThis.Length - 1)
                End If
            End If

            holdThis = holdThis & Chr(e.KeyValue)
            End If
        End If
End Sub

1 Ответ

0 голосов
/ 01 июня 2018

Я понял!Также теперь он работает на вкладке, вместо того, чтобы полагаться на нажатие пользователем пробела ... Вот код, который позволяет вам получить доступ к незафиксированному значению в комбинированном окне просмотра данных.

Private Sub dGrid1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles dGrid1.EditingControlShowing
    If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then
        RemoveHandler e.Control.PreviewKeyDown, AddressOf cBox_PreviewKeyDown

        CType(e.Control, ComboBox).DropDownStyle = ComboBoxStyle.DropDown
        CType(e.Control, ComboBox).AutoCompleteSource = AutoCompleteSource.ListItems
        CType(e.Control, ComboBox).AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Append

        AddHandler e.Control.PreviewKeyDown, AddressOf cBox_PreviewKeyDown
    End If
End Sub

Private Sub cBox_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs)
    Dim cBox As DataGridViewComboBoxEditingControl = sender
    Dim val As Object = cBox.Text

    If e.KeyCode = Keys.Tab Then
        Dim cBoxCol As DataGridViewComboBoxColumn

        'SO E-Mail Col
        cBoxCol = dGrid1.Columns.Item(3)
        cBoxCol.Items.Add(val)
        'ADC E-Mail Col
        cBoxCol = dGrid1.Columns.Item(4)
        cBoxCol.Items.Add(val)

        'Set cBox Value
        dGrid1.CurrentCell.Value = val
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...