Ошибка редактирования ячейки DataGridView с десятичным / шестнадцатеричным форматированием - PullRequest
2 голосов
/ 16 июня 2010

У меня есть DataGridView , привязанный к DataTable , в котором 1 + 16 столбцов определены как Целое число .

Стиль ячейки по умолчанию - шестнадцатеричные 2 цифры (.Format="X2").

При вводе в редактирование ячейки я хотел бы предоставить пользователю возможность записать значение в десятичном или шестнадцатеричном виде.

  1. Шестнадцатеричное можно записать, например, 0x00, 0X01, x02, XFF
  2. Десятичное число, как 0, 1, 2, 15

По этой причине в EditingControlShowing Я добавляю "0x" к значению TextBox

Private Sub BankGrid_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs)

    Dim grid As DataGridView = DirectCast(sender, DataGridView)
    If Not TypeOf e.Control Is TextBox Then Return

    Dim tb As TextBox = DirectCast(e.Control, TextBox)
    tb.Text = "0x" & tb.Text

    RemoveHandler tb.KeyPress, AddressOf TextBox_KeyPress
    AddHandler tb.KeyPress, AddressOf TextBox_KeyPress

End Sub

в то время как в TextBox_KeyPress sub Я выполняю всю фильтрацию ввода, чтобы избежать неправильных вводов.

Я не могу понять, к какому событию я могу прикрепиться, чтобы определить, когда редактирование закончено. Я бы хотел что-то, противоположное EditingControlShowing , чтобы я мог удалить «0x», но я не нашел его.

Ответы [ 2 ]

1 голос
/ 17 июня 2010

После того, как попробовали все возможные события как в TextBox, так и в DataGRidView, я наконец нашел одно полезное для моего случая.

CellParsing

Я копирую свой код, может быть, он может помочь кому-то еще:)

   Private Sub BankGrid_CellParsing(ByVal sender As Object, ByVal e As DataGridViewCellParsingEventArgs)

        Dim grid As DataGridView = DirectCast(sender, DataGridView)
        Dim cell As CustomCell = DirectCast(grid(e.ColumnIndex, e.RowIndex), CustomCell)

        If e.Value Is Nothing OrElse String.IsNullOrEmpty(e.Value.ToString) Then
            e.Value = cell.Value
        Else

            Dim iValue As Integer
            If TryParseNumeric(e.Value.ToString, iValue) Then

                If iValue >= 0 AndAlso iValue <= &HFF Then
                    e.Value = iValue  'value inside the range, accept it'
                Else
                    e.Value = cell.Value 'value outside the range, reload old value'
                End If

            Else                    
                e.Value = cell.Value 'invalid input, reload old value'
            End If

        End If

        e.ParsingApplied = True

    End Sub
0 голосов
/ 16 июня 2010

Я бы использовал gridView actionevent CellValueChanged. Если это слишком поздно, используйте CellValueChanging

...