必不可少的判断
在订单表中输入产品名称后,希望能够自动从产品表中取得对应产品的单价,并填入到单价列中,不少用户可能会如下编写代码:
1 |
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 |
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错误,大概是初学编程的用户提的最多的一个问题,大家一定要注意。