2015-06-20 2 views
1

Здесь я получаю следующую скобочную ошибку (Operator '-' не определен для типа 'Double' и type 'DBNull'.) при выполнении NetValueValidation(). Но его работы в колонке "discper" после выполнения DiscPerValidation()Оператор '-' не определен для типа 'Double' и типа 'DBNull'. [vb.net datagridview]

Private Sub grdPurchase_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles grdPurchase.CellEndEdit 
    CellEdited = True 
    CurrentColumn = e.ColumnIndex 
    CurrentRow = e.RowIndex 
    If Me.grdPurchase.Columns(Me.grdPurchase.CurrentCell.ColumnIndex).Name = "itemcode" Then 
     If Not Me.grdPurchase.Rows(e.RowIndex).Cells("itemcode").Value Is DBNull.Value Then 
      SeekItemDetails() 
     End If 
    Else 
     If Me.grdPurchase.Columns(Me.grdPurchase.CurrentCell.ColumnIndex).Name = "packingratio" Then 
      PackingRatioValidation() 
     ElseIf Me.grdPurchase.Columns(Me.grdPurchase.CurrentCell.ColumnIndex).Name = "price" Then 
      PriceValidation() 
      NetValueValidation() 
     ElseIf Me.grdPurchase.Columns(Me.grdPurchase.CurrentCell.ColumnIndex).Name = "grossamt" Then 
      GrossAmtValidation() 
      'NetValueValidation() 
     ElseIf Me.grdPurchase.Columns(Me.grdPurchase.CurrentCell.ColumnIndex).Name = "kgs" Then 
      KGSValid() 
      'NetValueValidation() 
     ElseIf Me.grdPurchase.Columns(Me.grdPurchase.CurrentCell.ColumnIndex).Name = "discper" Then 
      DiscPerValidation() 
      'NetValueValidation() 
     End If 
     SendKeys.Send("{UP}" + "{TAB}") 
    End If 
End Sub 

Private Sub PackingRatioValidation() 
    If Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("packingratio").Value Is DBNull.Value And _ 
      Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("packingratio_temp").Value Is DBNull.Value And _ 
      Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("itemcode").Value Is DBNull.Value Then 
     Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("qty").Value = _ 
      Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("packingratio").Value * _ 
      Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("packingratio_temp").Value 
    End If 
End Sub 

Private Sub PriceValidation() 
    If Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("itemcode").Value Is DBNull.Value And _ 
      Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("qty").Value Is DBNull.Value And _ 
      Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("price").Value Is DBNull.Value Then 
     Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("grossamt").Value = Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("price").Value * _ 
      Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("qty").Value 
    End If 
End Sub 

Private Sub GrossAmtValidation() 
    If Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("itemcode").Value Is DBNull.Value And _ 
      Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("qty").Value Is DBNull.Value And _ 
      Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("grossamt").Value Is DBNull.Value Then 
     Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("price").Value = Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("grossamt").Value/_ 
      Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("qty").Value 
    End If 
End Sub 

Private Sub KGSValid() 
    If Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("itemcode").Value Is DBNull.Value And _ 
      Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("qty").Value Is DBNull.Value And _ 
      Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("price").Value Is DBNull.Value And _ 
      Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("grossamt").Value Is DBNull.Value Then 
     Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("kgrate").Value = Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("grossamt").Value/_ 
      Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("kgs").Value 
    End If 
End Sub 

Private Sub DiscPerValidation() 
    If Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("itemcode").Value Is DBNull.Value And _ 
      Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("grossamt").Value Is DBNull.Value And _ 
      Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("discper").Value Is DBNull.Value Then 
     Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("discamt").Value = _ 
      (Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("grossamt").Value/100) * _ 
      Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("discper").Value 
    End If 
End Sub 

Private Sub NetValueValidation() 
    If Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("itemcode").Value Is DBNull.Value And _ 
    Not Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("grossamt").Value Is DBNull.Value Then 
     Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("netvalue").Value = _ 
     Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("grossamt").Value - _ 
     Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("discamt").Value 
    End If 
End Sub 
+0

Несвязанный, но количество копий/вставленных битов заставляет меня дрожать. –

ответ

2

сообщение означает, что в этом коде:

Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("grossamt").Value - _  
Me.grdPurchase.Rows(Me.grdPurchase.CurrentCell.RowIndex).Cells("discamt").Value 

Один из 2-х клеток DBNull. Основываясь на сообщении, это ячейка, участвующая в вычитании, которая является этими 2. Странная вещь - это то, где вы тестируете ячейку после ячейки для DBNull, но не здесь.


Не зря, но у вас есть много и много ненужного кода, там, что делает его трудно увидеть такого рода вещи. Например большой Если блок в CellEndEdit может быть упрощена что-то вроде:

Dim name As String = dgv2.Rows(e.ColumnIndex).Cells(e.ColumnIndex).Value.ToString 
Select Case name 
    Case "price" 
     PriceValidation(e.RowIndex) 
     NetValueValidation(...) 
    Case "grossamt" 
     GrossAmtValidation(...) 
End Select 

Я не знаю, почему вы Арент с использованием имеющихся в арг событий. Потом что-то, как это все, что нужно для PriceValidation (передавая строку работать на него из EventArgs):

Private Sub PriceValidation(r As Int32) 
    ' note: this is DOING pricing, not validation 
    Dim quan = SafeConvert(dgv.Rows(r).Cells("qty").Value) 
    Dim price = SafeConvert(dgv.Rows(r).Cells("price").Value) 

    dgv.Rows(r).Cells("grossamt").Value = (quan * price) 
End Sub 

Я подозреваю, Option Strict не на - но это должно быть:

grdPurchase.Rows(...).Cells("qty").Value = _ 
grdPurchase.Rows(...).Cells("packingratio").Value * _ 
grdPurchase.Rows(...).Cells("packingratio_temp").Value 

Значение ячейки возвращает объект, а не число, поэтому код пытается умножить 2 объекта. Простая процедура, которую вы можете использовать как для теста на DBNull на значения клеток (использованные выше в PriceValidation):

' helper function to convert a DBNull 
Private Function SafeConvert(v As Object) As Double 
    If System.DBNull.Value.Equals(v) Then 
     Return 0 
    Else 
     Dim d As Double = 0 
     If Double.TryParse(v.ToString, d) Then 

     End If 
     Return d 
    End If 
End Function 

Она будет работать на клетки, которые имеют количество или цену, но не Код товара (текст). Всякий раз, когда вы набираете один и тот же код снова и снова (и снова), остановитесь и ищите лучший способ.

+0

Plutonix ,, ... большое спасибо .... Я проделал свою работу с помощью кода ur. Я ожидаю, что помощь в будущем также будет ... (Y) :) –

Смежные вопросы