VB.NET - ячейка подстроки DataGridView для Number(10,2)
У меня есть DataGridView с колонкой, где пользователь может вставить двойной. Я должен контролировать значение ячейки, прежде чем вставлять в свою базу данных, потому что таблица имеет тип данных число (10,2) для этого поля.
Мой текущий код:
Dim length As Integer = Nothing
Dim row As Integer = DTG.CurrentCell.RowIndex
Dim column As Integer = DTG.CurrentCell.ColumnIndex()
With DTG(row).Cells(column)
length = Len(.Value)
If Not IsNothing(.Value) Then
If Not IsNumeric(.Value) Then
.Value = 0
End If
If length > 10 Then
.Value = .Value.SubString(0, 10)
If .Value.Contains(".") Then
.Value = .Value.SubString(0, 9)
End If
End If
End If
End With
Метод длины здесь не подходит, потому что, если моя ячейка содержит ".", Длина увеличивается.
Примеры:
1234567891 => length = 10 => insert : 1234567891
123456789.1 => length = 11 => insert : 123456789
Во втором случае мне нужно вставить 123456789.1
Может кто-нибудь посоветовать мне? Спасибо
3 ответа
Я наконец решил работать со значением ячейки.
If .Value > 99999999.99 Then
.Value = Convert.ToDouble(.Value.SubString(0, 8))
End If
Я изменил формат стиля на "N2", чтобы пользователь не мог написать более 2 десятичных знаков:
.ValueType = GetType(Double)
.Style.Format = "N2"
Я также нашел другой способ сделать это, я мог бы отформатировать мой столбец как замаскированное текстовое поле. Я попробую это решение позже.
РЕДАКТИРОВАТЬ: предыдущий ответ довольно плохо, но это помогло мне на некоторое время. Я нашел лучший способ справиться со своей проблемой. Я создал функцию, которая проверяет количество цифр перед десятичной дробью, и если длина больше 8, ее возвращение False
:
Public Function numberDigitsBeforeDecimal(ByVal montant As Double) As Boolean
Dim beforeDigit As String = montant.ToString.Substring(0, montant.ToString.IndexOf("."))
If beforeDigit.Length > 8 Then
Return False
Else
Return True
End If
End Function
Если я не ошибаюсь, поле базы данных с типом данных number(10,2)
означает, что он может нести максимальное значение 99999999.99
, используя это, вы можете изменить свой код так
Dim dbMaxNum As Decimal = 99999999.99
With DTG(row).Cells(column)
If Not IsNothing(.Value) Then
If Not IsNumeric(.Value) Then
.Value = 0
Else
.Value = Math.Min( _
dbMaxNum, _
Math.Round(CDec(.Value), 2, MidpointRounding.AwayFromZero))
End If
End If
End With
Где мы в первом туре .Value
до двух знаков после запятой, а затем мы выбираем минимум между результатом и максимумом, которое может содержать поле вашей базы данных (99999999.99
)
Опция MidpointRounding.AwayFromZero
чтобы предотвратить неожиданные результаты округления, например 32.625
округление до 32.62
(проблема, поднятая в этом вопросе).
Ты можешь использовать .Value.IndexOf(".")
получить количество цифр перед десятичным разделителем (<= 10).