2016-02-05 27 views
0

我有一个DataGridView用户可以插入双列。在我插入数据库之前,我必须控制单元格的值,因为表中有一个这个字段的数字(10,2)数据类型。VB.NET - 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

有人可以告诉我?谢谢

回答

-1

我终于决定使用单元格值。

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 
1

您可以使用.Value.IndexOf(".")获取小数点分隔符前的位数(< = 10)。

+0

是否有与.value类似的工作,包括小数点后面的数字? – nbadaud

+0

分隔符后的位数:'Len(.Value) - .Value.IndexOf(“。”) - 1'。当然,这只有在'.Value.Contains(“。”)'为真时才有效。 – Bioukh

+0

我认为有更好的方法来做到这一点,我会继续搜索。 – nbadaud

1

如果我没有记错,与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(在this question中引起的问题)。

+0

阅读[oracle](https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm)文档中的number数据类型部分。具有NUMBER(9,2)的 7,456,123.89被存储为7456123。89 – nbadaud

+0

我没有看到我对我所说的任何事情都不正确,你在暗示什么?该文档说,一个数据类型'NUMBER(10,2)'能够保存最多10位数字,但其中2个保留给小数部分(这意味着_数字部分不能超过8位数字),所以最大数量可以保持的是'99999999.99'。在这两个例子中,你都试图插入大于'99999999.99'的数字。 –

相关问题