处理数据行(DataRow)
Windows窗体中的数据绑定列表框和组合框很节省时间典型的代码如下(假定已经建立了SqlDataAdapter或者其它部件获取数据)
Dim ds As New DataSet()SqlDataAdapterFill(ds Customers)ListBoxDataSource = dsTables(Customers)ListBoxDisplayMember = CompanyNameListBoxValueMember = CustomerID
在这种情况下代码使用Northwind数据库的顾客记录工作DisplayMember属性设置为你希望用户在列表框中看到的记录字段它是customers表的CompanyName通常ValueMember属性设置为数据表中的一个键字段对于customer来说是CustomerID一旦用户选择了列表框中的一行很容易使用列表框的SelectedValue属性获得键字段
MsgBox(ListBoxSelectedValue)
但是有可能需要一个与被选择项相关的整个数据行对象的引用例如如果被选择的行需要被删除就不知道键了你需要一个数据行的引用以使用Delete方法
典型的Visual Basic开发者通常这样想我已经得到了该行的键了我将编写一些逻辑来查找使用该键的行这样可以实现但是有更好的实现方法可以使用一行代码获取与列表框中选项关联的数据行
Dim dr As DataRow = CType(ListBoxSelectedItem DataRowView)Row
通常该逻辑不会凭直觉出现即使对经验丰富的开发者为了解释这是怎样实现的我把上面的一行拆成几行下面的代码与上面代码的功能相同
Dim drv As DataRowViewdrv = CType(ListBoxSelectedItem DataRowView)Dim dr As DataRowdr = drvRow
DataRowView类是数据行的包装它被多个Windows窗体控件使用它使得显示与控件中的数据行相关的数据更加容易当列表框被数据绑定到数据表时(假定列表框中的有些行当前被选定了)列表框的SelectedItem属性保存了一个DataRowView对象
这意味着我们能把列表框的SelectedItem属性转换到DataRowView对象这就是上面代码中的第二行实现的接着DataRowView暴露一个Row属性它指向被包装的数据行上面的代码声明了一个数据行并设置了Row属性
转换对象的类型以访问它的接口的技术在Visual Basic 中不是经常使用但是在Visual Basic NET中这是经常的有了上面的例子后大多数有经验的开发者迅速跟上了这种技术
数据行的引用(dr)可用于用任何方式维护行访问数据行中的任何特定字段是可行的行中的数据可以被改变能使数据行的Delete方法把该行标识为删除或者从数据表的行集合中删除该行下面的代码标识删除了一行
drDelete()
使用主键(由ListBoxSelectedValue返回)查找下层数据行的方法需要很多代码要花很长时间执行起来更慢对于刚开始使用Visual Basic NET的程序员来说花几个小时编码是很正常的理解上面的技术节约了很多时间更简单容易维护代码