以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  DataColChanged中的OldValue  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=155797)

--  作者:lhj1168
--  发布时间:2020/9/27 9:29:00
--  DataColChanged中的OldValue

在学习表事件DataColChanged,下面的代码有个地方没搞懂:如果是新增一个产品,此时DataColChanged事件中,OldValue应该是空值,NewValue才是新增的产品名称,我理解,这里应该是用NewValue,然后到库存表中看新增的产品是否存在,如果用OldValue,相当于到库存表中看是否有产品ID为空值的记录。但下面代码中dr = DataTables("库存").Find("产品ID = \'" & e.OldValue & "\'")用的是oldValue,也能正常运行,为什么?


假定有个产品表和一个库存表,两个表都有产品编号、产品名称、产品规格3列,且没有建立关联。希望

①产品表新增一个产品,库存表也增加此产品

②产品表删除一个产品,库存表也删除此产品

③在产品表正更改产品的编号、名称或规格后,库存表也同步修改

在产品表的DataColChanged事件中的代码如下:

Select Case e.DataCol.Name

    Case "产品ID"    \'刚编辑的列是产品ID

        Dim dr As DataRow

        \'到库存表中查找,看是否存在刚编辑列的产品ID(旧值),为什么要取旧值,而不取新值??

        dr = DataTables("库存").Find("产品ID = \'" & e.OldValue & "\'")

        If dr Is Nothing     \'如果不存在,说明需要将产品表中的产品ID,产品名称,产品规格添加到库存表

            dr = DataTables("库存").AddNew()    \'在库存表中新增一行

            dr("产品ID") = e.DataRow("产品ID")

            dr("产品名称") = e.DataRow("产品名称")

            dr("产品规格") = e.DataRow("产品规格")

        Else         \'如果库存表中存在产品表中编辑的产品ID

            dr("产品ID") = e.DataRow("产品ID")  

        End If

    Case "产品名称","产品规格"

        Dim dr As DataRow = DataTables("库存").Find("产品ID = \'" & e.DataRow("产品ID") & "\'")

        If dr IsNot Nothing    

            dr(e.DataCol.Name) = e.DataRow(e.DataCol.Name)   

        End If

End Select

[此贴子已经被作者于2020/9/27 9:32:50编辑过]

--  作者:有点蓝
--  发布时间:2020/9/27 9:50:00
--  
假设是新增的,OldValue确实是空值,但是库存中肯定也还没有这个产品,所以不管使用什么条件查,查询结果肯定是不存在的。
--  作者:lhj1168
--  发布时间:2020/9/27 10:45:00
--  
明白了,谢谢!