分享
 
 
 

用DataGrid浏览数据

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

数据相关实例:

数据集

Friend WithEvents Ds1 As DGDataViewSample.Dataset1

Dataset1为项目中的数据集框架文件,结构包括两个表:tablePerson和tableType

数据库连接变量

Friend WithEvents ODC As System.Data.OleDb.OleDbConnection

本例使用Access数据库,所以数据库连接使用OleDbConnection类型。针对不同3数据库类型,.NET提供不同的数据库连接类。

例如SQL Server数据库需要使用SqlConnection,ODBC数据源使用OdbcConnection,Oracle数据库需要使用OracleConnection。

数据适配器

Friend WithEvents ODDAPerson As System.Data.OleDb.OleDbDataAdapter

Friend WithEvents ODDAType As System.Data.OleDb.OleDbDataAdapter

与数据库连接类似,对于不同的数据库类型,需要使用不同的数据适配器类。

例如SQL Server数据库需要使用SqlDataAdapter,ODBC数据源使用OdbcDataAdapter,Oracle数据库需要使用OracleDataAdapter。

数据适配器的属性可以通过工具栏添加,按照向导提示完成即可;可以在设计时在属性窗口中进行配置;可以在编程时用代码设置。一个数据适配器相当于一个数据通道,负责将数据源中的数据填充到相应的数据集或数据表中,在完成对数据集或数据表的修改之后,再通过数据适配器将更新后的数据提交到数据库的源表中。通过修改相应的SQL语句,可以用编程控制数据适配器,使其匹配数据源中不同的表或视图。

本例为方便起见,为每一个表使用了单独的数据适配器和数据视图。

数据视图

Friend WithEvents DVPerson As System.Data.DataView

Friend WithEvents DVType As System.Data.DataView

本例中使用数据视图作为DataGrid的数据源。数据集和数据表也可以直接作为数据源使用。

数据初始化:

在初始化界面时,需要做两件事情,一个是初始化数据(本例中为InitData过程),将数据源中的数据填充到数据实例中;另一个是适当设置窗口中的某些控件属性(本例中为InitCtrl过程),以使数据能够正确的显示出来。

初始化数据

Private Sub InitData()

Try

ODC.Open()

Catch ex As Exception

MsgBox(ex.Message)

Application.Exit()

End Try

Try

ODDAPerson.Fill(Ds1.tablePerson)

ODDAType.Fill(Ds1.tableType)

Catch ex As Exception

MsgBox(ex.Message)

Application.Exit()

End Try

End Sub

初始化窗口控件

Private Sub InitUI()

LBTable.SelectedIndex = 0

DG.Select(0)

End Sub

数据浏览导航:

按钮第一个

Private Sub BFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BFirst.Click

DG.UnSelect(DG.CurrentRowIndex)

Dim dv As DataView

dv = DG.DataSource

If dv.Table.Rows.Count > 0 Then

DG.CurrentRowIndex = 0

DG.Select(DG.CurrentRowIndex)

End If

End Sub

按钮上一个

Private Sub BPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BPrev.Click

DG.UnSelect(DG.CurrentRowIndex)

Dim dv As DataView

dv = DG.DataSource

If DG.CurrentRowIndex - 1 <= 0 Then

DG.CurrentRowIndex = 0

Else

DG.CurrentRowIndex = DG.CurrentRowIndex - 1

End If

DG.Select(DG.CurrentRowIndex)

End Sub

按钮下一个

Private Sub BNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BNext.Click

DG.UnSelect(DG.CurrentRowIndex)

Dim dv As DataView

dv = DG.DataSource

If DG.CurrentRowIndex + 1 >= dv.Table.Rows.Count Then

DG.CurrentRowIndex = dv.Table.Rows.Count - 1

Else

DG.CurrentRowIndex = DG.CurrentRowIndex + 1

End If

DG.Select(DG.CurrentRowIndex)

End Sub

按钮最后一个

Private Sub BLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BLast.Click

DG.UnSelect(DG.CurrentRowIndex)

Dim dv As DataView

dv = DG.DataSource

DG.CurrentRowIndex = dv.Table.Rows.Count - 1

DG.Select(DG.CurrentRowIndex)

End Sub

数据操作

按钮添加

Private Sub BAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAdd.Click

Dim dv As DataView

Dim rowNew As DataRowView

dv = DG.DataSource

rowNew = dv.AddNew()

rowNew.EndEdit()

DG.CurrentRowIndex = dv.Table.Rows.Count - 1

DG.Select(DG.CurrentRowIndex)

End Sub

在调用AddNew添加一条新记录之后,紧接着调用了EndEdit,这样是表明这个添加操作已经完成,可以对这个新记录进行其它任何操作了。在此调用之前,新记录被认为是正在编辑的记录,会被锁定,这时对其进行删除操作就会引发错误,而且这条记录并不会真正的存入表中。在EndEdit调用之后,新记录存入表中,但是行状态被标志为新增记录。

这一步完成后,用户一般会通过表格输入新记录的各个字段值。在程序中,实际上是将这个过程视做对新增记录的修改。

按钮删除

Private Sub BDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BDel.Click

Dim dv As DataView

dv = DG.DataSource

dv.Delete(DG.CurrentRowIndex)

DG.Select(DG.CurrentRowIndex)

End Sub

按钮保存

Private Sub BSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BSave.Click

Me.UpdateData()

End Sub

保存子过程

Private Sub UpdateData()

Dim addds As DataSet

Dim delds As DataSet

Dim updateds As DataSet

Try

addds = Ds1.GetChanges(DataRowState.Added)

delds = Ds1.GetChanges(DataRowState.Deleted)

updateds = Ds1.GetChanges(DataRowState.Modified)

If addds Is Nothing Then

Else

ODDAPerson.Update(addds)

ODDAType.Update(addds)

End If

If updateds Is Nothing Then

Else

ODDAPerson.Update(updateds)

ODDAType.Update(updateds)

End If

If delds Is Nothing Then

Else

ODDAPerson.Update(delds)

ODDAType.Update(delds)

End If

Catch ex As Exception

MsgBox(ex.Message)

Exit Sub

End Try

Try

DVPerson.Table.AcceptChanges()

DVType.Table.AcceptChanges()

Ds1.AcceptChanges()

Catch ex As Exception

MsgBox(ex.Message)

Exit Sub

End Try

End Sub

* 在为DataTable调用AcceptChanges之后,将清除所有行的状态标志,也就是说,程序将无法再区分哪些是新添加的,哪些是被修改后的。所以所有利用行状态标志对数据源进行修改的操作都放在了此调用之前。

* 将各种修改存回数据源的顺序为:添加的行--被修改的行--被删除的行。以免在操作时发生逻辑错误。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有