楼主记得使用Datacolchanged事件的时候,一定要判断列名。
一定要判断列名!
不少人,特别是初学编程的人,没有在DataColChanged事件中判断列名的习惯,例如为了在订单表计算金额,往往只是在DataColChanged简单地写入代码:
Dim dr As DataRow = e.DataRow
dr("金额") = dr("数量") * dr("单价") * (1 - dr("折扣"))
这样可能会带来严重的后果,首先会导致重复的计算,因为数量、单价或折扣发生变化后,触发DataColChanged事件,计算得出新的金额,而金额列内容的变化,会再次触发DataColChanged事件,使得金额被重新计算一次;实际上其他不相关列,例如日期、客户、产品等列内容发生变化后,同样会触发DataColChanged事件,导致金额列被重新计算。
显然这样的代码,效率实在是太低,而且在机缘巧合的情况下,很可能会出现死循环,导致程序崩溃。
所以我们一定要养成良好的习惯,在编写DataColChanged事件代码时,判断发生变化列的名称,只有相关列发生变化时,才进行特定的重算工作。
例如:
Dim
dr As DataRow = e.DataRow
Select Case e.DataCol.Name
Case "数量","单价","折扣"
dr("金额") = dr("数量") * dr("单价") * (1 - dr("折扣"))
End Select
这节的内容不仅仅针对DataColChanged,实际上对于任何表事件都有效,例如DataColChaning、PrepareEdit、ValidateEdit、AfterEdit等等。