必不可少的判断

在订单表中输入产品名称后,希望能够自动从产品表中取得对应产品的单价,并填入到单价列中,不少用户可能会如下编写代码:

1
2
3
4
5
6
7
8
9
10

If e.DataCol.Name = "产品名称" Then '如果内容发生变动的是产品列
    If e.NewValue Is Nothing Then '如果新值是空白,也就是产品列的内容为空
        e.
DataRow("单价") = Nothing '那么清空此行单价列的内容
   
Else
        '否则在产品表查找同名的产品行,将找到的行赋值给变量dr
        Dim
dr As DataRow
        dr = DataTables("产品").Find("[产品名称] = '" & e.NewValue & "'")
        e.DataRow("单价") = dr("单价")
    End
If
End
If

为便于讲述,我们给代码加上了编号。
上面的代码看上去是没有问题的,但是疏忽了一个问题,就是订单表所输入的产品,可能在产品表中并不存在对应的行,这样第7行代码运行后,变量dr等于空值Nothing,从而导致第8行代码出错,出现下图所示的错误提示:

为了避免这个问题,我们必须在代码中判断产品表中是否存在对应的行,也就是变量dr是否为Nothing:

1
2
3
4
5
6
7
8
9
10
11
12

If e.DataCol.Name = "产品名称" Then '如果内容发生变动的是产品列
    If e.NewValue Is Nothing Then '如果新值是空白,也就是产品列的内容为空
        e.
DataRow("单价") = Nothing '那么清空此行单价列的内容
   
Else
        Dim
dr As DataRow
       
'否则在产品表查找同名的产品行,将找到的行赋值给变量dr
        dr =
DataTables("产品").Find("[产品名称] = '" & e.NewValue & "'")
        If
dr IsNot Nothing Then '如果找到了同名的产品行,也就是dr不是Nothing
            e.
DataRow("单价") = dr("单价")
        End
If
    End
If
End
If

上面的第8行代码判断dr是否为Nothing,也就是判断是否在产品表中找到了对应的行,如果找到则执行第9行代码,将产品表的单价值填入到订单表中。

这里只是以DataColChanged事件和Find方法作为例子,实际上,在任何进行查找的场合,都要考虑到找不到的情况。
我们在技术支持过程中,感觉这个System.NullReferenceException错误,大概是初学编程的用户提的最多的一个问题,大家一定要注意。

 


本页地址:http://www.foxtable.com/webhelp/topics/2044.htm