数据集
Friend WithEvents Ds As DGDataViewSampleDataset
Dataset为项目中的数据集框架文件结构包括两个表tablePerson和tableType
数据库连接变量
Friend WithEvents ODC As SystemDataOleDbOleDbConnection
本例使用Access数据库所以数据库连接使用OleDbConnection类型针对不同数据库类型NET提供不同的数据库连接类
例如SQL Server数据库需要使用SqlConnectionODBC数据源使用OdbcConnectionOracle数据库需要使用OracleConnection
数据适配器
Friend WithEvents ODDAPerson As SystemDataOleDbOleDbDataAdapter
Friend WithEvents ODDAType As SystemDataOleDbOleDbDataAdapter
与数据库连接类似对于不同的数据库类型需要使用不同的数据适配器类
例如SQL Server数据库需要使用SqlDataAdapterODBC数据源使用OdbcDataAdapterOracle数据库需要使用OracleDataAdapter
数据适配器的属性可以通过工具栏添加按照向导提示完成即可可以在设计时在属性窗口中进行配置可以在编程时用代码设置一个数据适配器相当于一个数据通道负责将数据源中的数据填充到相应的数据集或数据表中在完成对数据集或数据表的修改之后再通过数据适配器将更新后的数据提交到数据库的源表中通过修改相应的SQL语句可以用编程控制数据适配器使其匹配数据源中不同的表或视图
本例为方便起见为每一个表使用了单独的数据适配器和数据视图
数据视图
Friend WithEvents DVPerson As SystemDataDataView
Friend WithEvents DVType As SystemDataDataView
本例中使用数据视图作为DataGrid的数据源数据集和数据表也可以直接作为数据源使用
数据初始化
在初始化界面时需要做两件事情一个是初始化数据(本例中为InitData过程)将数据源中的数据填充到数据实例中另一个是适当设置窗口中的某些控件属性(本例中为InitCtrl过程)以使数据能够正确的显示出来
初始化数据
Private Sub InitData()
Try
ODCOpen()
Catch ex As Exception
MsgBox(exMessage)
ApplicationExit()
End Try
Try
ODDAPersonFill(DstablePerson)
ODDATypeFill(DstableType)
Catch ex As Exception
MsgBox(exMessage)
ApplicationExit()
End Try
End Sub
初始化窗口控件
Private Sub InitUI()
LBTableSelectedIndex =
DGSelect()
End Sub
数据浏览导航
按钮第一个
Private Sub BFirst_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles BFirstClick
DGUnSelect(DGCurrentRowIndex)
Dim dv As DataView
dv = DGDataSource
If dvTableRowsCount > Then
DGCurrentRowIndex =
DGSelect(DGCurrentRowIndex)
End If
End Sub
按钮上一个
Private Sub BPrev_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles BPrevClick
DGUnSelect(DGCurrentRowIndex)
Dim dv As DataView
dv = DGDataSource
If DGCurrentRowIndex <= Then
DGCurrentRowIndex =
Else
DGCurrentRowIndex = DGCurrentRowIndex
End If
DGSelect(DGCurrentRowIndex)
End Sub
按钮下一个
Private Sub BNext_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles BNextClick
DGUnSelect(DGCurrentRowIndex)
Dim dv As DataView
dv = DGDataSource
If DGCurrentRowIndex + >= dvTableRowsCount Then
DGCurrentRowIndex = dvTableRowsCount
Else
DGCurrentRowIndex = DGCurrentRowIndex +
End If
DGSelect(DGCurrentRowIndex)
End Sub
按钮最后一个
Private Sub BLast_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles BLastClick
DGUnSelect(DGCurrentRowIndex)
Dim dv As DataView
dv = DGDataSource
DGCurrentRowIndex = dvTableRowsCount
DGSelect(DGCurrentRowIndex)
End Sub
数据操作
按钮添加
Private Sub BAdd_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles BAddClick
Dim dv As DataView
Dim rowNew As DataRowView
dv = DGDataSource
rowNew = dvAddNew()
rowNewEndEdit()
DGCurrentRowIndex = dvTableRowsCount
DGSelect(DGCurrentRowIndex)
End Sub
在调用AddNew添加一条新记录之后紧接着调用了EndEdit这样是表明这个添加操作已经完成可以对这个新记录进行其它任何操作了在此调用之前新记录被认为是正在编辑的记录会被锁定这时对其进行删除操作就会引发错误而且这条记录并不会真正的存入表中在EndEdit调用之后新记录存入表中但是行状态被标志为新增记录
这一步完成后用户一般会通过表格输入新记录的各个字段值在程序中实际上是将这个过程视做对新增记录的修改
按钮删除
Private Sub BDel_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles BDelClick
Dim dv As DataView
dv = DGDataSource
dvDelete(DGCurrentRowIndex)
DGSelect(DGCurrentRowIndex)
End Sub
按钮保存
Private Sub BSave_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles BSaveClick
MeUpdateData()
End Sub
保存子过程
Private Sub UpdateData()
Dim addds As DataSet
Dim delds As DataSet
Dim updateds As DataSet
Try
addds = DsGetChanges(DataRowStateAdded)
delds = DsGetChanges(DataRowStateDeleted)
updateds = DsGetChanges(DataRowStateModified)
If addds Is Nothing Then
Else
ODDAPersonUpdate(addds)
ODDATypeUpdate(addds)
End If
If updateds Is Nothing Then
Else
ODDAPersonUpdate(updateds)
ODDATypeUpdate(updateds)
End If
If delds Is Nothing Then
Else
ODDAPersonUpdate(delds)
ODDATypeUpdate(delds)
End If
Catch ex As Exception
MsgBox(exMessage)
Exit Sub
End Try
Try
DVPersonTableAcceptChanges()
DVTypeTableAcceptChanges()
DsAcceptChanges()
Catch ex As Exception
MsgBox(exMessage)
Exit Sub
End Try
End Sub
* 在为DataTable调用AcceptChanges之后将清除所有行的状态标志也就是说程序将无法再区分哪些是新添加的哪些是被修改后的所以所有利用行状态标志对数据源进行修改的操作都放在了此调用之前
* 将各种修改存回数据源的顺序为添加的行——被修改的行——被删除的行以免在操作时发生逻辑错误