问题
I have a DataGridView bound to a DataTable that has 1+16 columns defined as Integer.
The default cell style is hexadecimal 2 digits (.Format="X2"
).
When entering in cell editing I would like to provide to the user, the possibility to write the value in decimal or hexdacimal.
- Hexadecimal could be written like, for example, 0x00, 0X01, x02, XFF
- Decimal like 0, 1, 2, 15
For this reason in EditingControlShowing I add "0x" to the TextBox value
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
while in TextBox_KeyPress sub I perform all input filtering to avoid invalid inputs.
What I cannot understand is to which event may I attach to detect when the editing is finished. I would like something opposite to EditingControlShowing so that I can remove "0x" but I didn't found it.
回答1:
After try all possible events both in TextBox and in DataGRidView I finally found one useful for my case.
CellParsing
I copy my code maybe it could help someone else :)
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
回答2:
I would use the gridView actionevent CellValueChanged. If that is too late then use CellValueChanging
来源:https://stackoverflow.com/questions/3054767/datagridview-cell-editing-issue-with-decimal-hexadecimal-formatting