2016-02-05 49 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'的數字。 –

相關問題