我有DataGridView,其数据源是一个bindingList,我需要根据用户数据输入进行一些计算。
我希望允许用户在“卖出价值”列[第7列]中输入一个值,然后将其与另一个单元格中的值(成本值[col 8])一起使用以计算值对于该行中的另一个单元格,是“边距值” [Col 9]。
i.e.
Col 9 = col 7 - Col 8 (Margin = Sell Value -cost Value)
我在DGV的CellValidating事件中获得了此代码。 Case参数是Column索引。有点罗word,因为我一直在使用调试语句来检查运行情况。
Case 7
Debug.Print("Checking Sell Value")
If Not IsNumeric(dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(e.ColumnIndex).EditedFormattedValue) Then
Debug.Print("Not a valid sell value")
dgvPurchaseOrderItems.Rows(e.RowIndex).ErrorText = "Need a valid sell value."
e.Cancel = True
End If
'update Margin Value
Debug.Print("Sell Value OK - so updating Margin value")
Debug.Print("Sell (edited Value): " & dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(7).EditedFormattedValue)
Debug.Print("Sell (Value): " & dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(7).Value)
SellValue = Convert.ToDecimal(dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(7).EditedFormattedValue)
Debug.Print("Sell Value (decimal): " & SellValue)
costvalue = Convert.ToDecimal(dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(8).Value)
Debug.Print("Cost Value (decimal): " & costvalue)
MarginValue = SellValue - costvalue
Debug.Print("Margin Value:" & MarginValue)
dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(9).Value = MarginValue
Case 8
Debug.Print("Checking Cost Value ")
If Not IsNumeric(dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(e.ColumnIndex).EditedFormattedValue) Then
Debug.Print("Not a valid cost value")
dgvPurchaseOrderItems.Rows(e.RowIndex).ErrorText = "Need a valid cost value."
e.Cancel = True
End If
'update Margin Value
Debug.Print("Cost Value OK - so updating Margin value")
Debug.Print("Sell (edited Value): " & dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(7).EditedFormattedValue)
Debug.Print("Sell (Value): " & dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(7).Value)
Debug.Print("Cost (edited Value): " & dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(8).EditedFormattedValue)
Debug.Print("Cost (Value): " & dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(8).Value)
SellValue = Convert.ToDecimal(dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(7).Value)
Debug.Print("Sell Value (decimal): " & SellValue)
costvalue = Convert.ToDecimal(dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(8).EditedFormattedValue)
Debug.Print("Cost Value (decimal): " & costvalue)
MarginValue = SellValue - costvalue
Debug.Print("Margin Value:" & MarginValue)
dgvPurchaseOrderItems.Rows(e.RowIndex).Cells(9).Value = MarginValue
但是,尽管似乎在更新单元9,但第7列的内容再次设置为0。
我要以正确的方式解决这个问题吗?我应该使用CellValidating事件或其他事件吗?我不明白为什么当我不取消编辑时刚才输入的单元格的会被重置为原始值?
啊,我在底层绑定列表的属性中进行了计算。似乎可行。
问题仍然存在-我应该在cellValidating事件,绑定列表属性还是其他地方更改单元格的值?
谢谢
答案 0 :(得分:0)
答案不是直接使用CellValidating事件中的计算来直接更新列。
相反,更改后端数据源中的值,并依靠数据源和DGV之间的2向绑定将更改显示回给用户。
所以我现在在sell_value属性中有此属性,在cost_value属性中也有类似的内容。
当用户更改DGV中的卖出或成本值时,将调用设置这些属性的绑定列表,然后运行计算以找到保证金成本,然后以只读方式自动更新该成本。显示该属性的列。
Public Property sell_value() As Decimal
Get
Return _sell_value
End Get
Set(ByVal value As Decimal)
_sell_value = value
Debug.Print("Setting margin value in Sell_value Property")
margin_value = _sell_value - _cost_value
Debug.Print("Setting margin % in sell_value Property")
If sell_value <> 0 Then
margin_percent = _margin_value / sell_value
Else
margin_percent = 0
End If
End Set
End Property