[初学VB.NET]使用心得随记(一) : 关于数据的绑定及更新

类别:.NET开发 点击:0 评论:0 推荐:

程序界面
程序界面如上图所示,用datagrid绑定数据并同时绑定到textbox
要求:
1、随着datagrid(只读)记录指针的移动,textbox的内容随着变化
2、实现修改、添加、删除操作
说明:
    为了方便操作,所有textbox均取名为“test“+相应的字段名
==========================================================
功能程序代码如下:

Imports System
Imports System.Reflection

Public Class Frm1
    Inherits System.Windows.Forms.Form
    
    Dim OleDbConn1 As New System.Data.OleDb.OleDbConnection
    Dim dataset1As New System.Data.DataSet

    Dim adapter1 As System.Data.OleDb.OleDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter("Select * from 表1", OleDbConn1 )
'注意,此处用OleDbCommandBuilder与adapter1 相关联,自动生成相应的添加、删除、更新SQL语句
    Dim CB_adapter1As System.Data.OleDb.OleDbCommandBuilder = New System.Data.OleDb.OleDbCommandBuilder(adapter1)

Private Sub Frm1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        OleDbConn1 .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" d:\test\test.mdb"
        OleDbConn1 .Open()
       '填充
        adapter1 .Fill(dataset1, "表1")
      '将数据绑定到datagrid
        Me.DataGrid1.DataSource = dataset1.Tables("表1")

        '下面的代码将字段值绑定到相应的textbox
        For i = 0 To dataset1.Tables("表1").Columns.Count - 1
            '根据textbox的名字得到相应的实例
            namestr = ""
            namestr = "test" & dataset1.Tables("表1").Columns.Item(i).Caption
            Dim t As Type = Me.GetType
            Dim f As FieldInfo = t.GetField("_" & namestr, BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.Public)
            Dim MyControl As TextBox = CType(f.GetValue(Me), TextBox)
            '将得到的textbox实例执行相应的数据绑定
            MyControl.DataBindings.Add("TEXT", dataset1.Tables("表1"), dataset1.Tables("表1").Columns.Item(i).Caption)
        Next
        '关闭数据连接
            OleDbConn1.close()
End Sub

'保存操作
 Private Sub BtnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSave.Click
        
        '停止当前的任何编辑。
        Me.BindingContext(dataset1, "表1").EndCurrentEdit()

       '获取dataset中更改的内容
        Dim chgobj As New DataTable
               chgobj = CType(dataset1.Tables("表1").GetChanges, DataTable)
      '如查更改的内容不为空,就执行保存操作
      If  Not chgobj Is Nothing Then
          '打开数据连接
           if OleDbConn1.state=0 tthen OleDbConn1 .open

            adapter1.Update(chgobj)
             dataset1.Merge(chgobj)
            dataset1.AcceptChanges()
            dataset1.Tables("表1").Clear()
            adapter1.Fill(dataset1, "表1")
            '关闭数据连接
            OleDbConn1.close()
        End If

    End Sub

   '删除操作
   Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
         If (Me.BindingContext(dataset1, "表1").Count > 0) Then
                       'Me.BindingContext(dataset1, "表1").RemoveAt(Me.BindingContext(dataset1, "表1").Position)
                 Me.BindingContext(dataset1, "表1").RemoveAt(Me.DataGrid1.CurrentRowIndex())
         End If

    End Sub

  '添加操作
    Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
          Try
            '清除当前编辑内容
            Me.BindingContext(dataset1, "表1").EndCurrentEdit()
            '执行添加
            Me.BindingContext(dataset1, "表1").AddNew()

           '移动datagrid的指针
            Me.BindingContext(dataset1, "表1").Position = (Me.BindingContext(dataset1, "表1").Count + 1)          
            Me.DataGrid1.CurrentRowIndex = Me.BindingContext(dataset1, "表1").Position

        Catch eEndEdit As System.Exception
            System.Windows.Forms.MessageBox.Show(eEndEdit.Message)
        End Try
    End Sub

 '取消操作
    Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
               Me.BindingContext(dataset1, "表1").CancelCurrentEdit()
    End Sub

    ……
    ……
End Class

====================================================================
=                                                                            心得体会                                                        =
====================================================================

1、根据textbox的名字将其执行数据绑定:
      需引用Imports System.Reflection
2、OleDbCommandBuilder 的使用(下面为MSDN的概述):
      OleDbDataAdapter 不会自动生成为了使对 DataSet 所作的更改和相关联的数据源协调起来所必须的 SQL 语句。但是,如果设置了 OleDbDataAdapterSelectCommand 属性,那么就可以创建 OleDbCommandBuilder 对象,来自动生成 SQL 语句以更新单表。然后,OleDbCommandBuilder 将生成其他任何未设置的 SQL 语句。
        每当设置了
DataAdapter 属性,OleDbCommandBuilder 就将其本身注册为 RowUpdating 事件的侦听器。一次只能将一个 OleDbDataAdapter 与一个 OleDbCommandBuilder 对象(或相反)互相关联。
        为了生成 INSERT、UPDATE 或 DELETE 语句,OleDbCommandBuilder 会自动使用 SelectCommand 属性来检索所需的元数据集。如果在检索元数据后(例如在第一次更新后)更改 SelectCommand,则应调用
RefreshSchema 方法来更新元数据。
      OleDbCommandBuilder 还使用由 SelectCommand 引用的
ConnectionCommandTimeoutTransaction 属性。如果修改了任何这些属性或者替换了 SelectCommand 本身,用户则应调用 RefreshSchema。否则,InsertCommandUpdateCommandDeleteCommand 属性都保留它们以前的值。
     如果调用 Dispose,则会解除 OleDbCommandBuilderOleDbDataAdapter 的关联,并且不再使用所生成的命令。
     OleDbDataAdapter
不会自动生成为了使对 DataSet 所作的更改和相关联的数据源协调起来所必须的 SQL 语句。但是,如果设置了 OleDbDataAdapterSelectCommand 属性,那么就可以创建 OleDbCommandBuilder 对象,来自动生成 SQL 语句以更新单表。然后,OleDbCommandBuilder 将生成其他任何未设置的 SQL 语句。
     每当设置了 DataAdapter 属性,OleDbCommandBuilder 就将其本身注册为 RowUpdating 事件的侦听器。一次只能将一个 OleDbDataAdapter 与一个 OleDbCommandBuilder 对象(或相反)互相关联。
      为了生成 INSERT、UPDATE 或 DELETE 语句,OleDbCommandBuilder 会自动使用 SelectCommand 属性来检索所需的元数据集。如果在检索元数据后(例如在第一次更新后)更改 SelectCommand,则应调用 RefreshSchema 方法来更新元数据。
      OleDbCommandBuilder
还使用由 SelectCommand 引用的
ConnectionCommandTimeoutTransaction 属性。如果修改了任何这些属性或者替换了 SelectCommand 本身,用户则应调用 RefreshSchema。否则,InsertCommandUpdateCommandDeleteCommand 属性都保留它们以前的值。
     如果调用 Dispose,则会解除 OleDbCommandBuilderOleDbDataAdapter 的关联,并且不再使用所生成的命令。



3、数据更新中出现的问题:
      问题:更新数据后,出现一个奇怪的问题:datagrid中更新的数据出现相同的两条记录
      解决方法:
        a)、更新记录后,清除dataset,再重新填充
               dataset1.Tables("表1").Clear()
              adapter1.Fill(dataset1, "表1")
       b)、  另一种方法为:在form1的load 过程(Frm1_Load)中定义dataset1.Tables("表1")的主键:
 
        dataset1.Tables("表1").PrimaryKey = New DataColumn() {dataset1.Tables("表1").Columns("主键字段")}
       '如是自动编号,可以加入以下内容: 
       dataset1.Tables("表1").Columns("主键字段").AutoIncrement = True
        dataset1.Tables("表1").Columns("主键字段").AutoIncrementSeed = 1
        dataset1.Tables("表1").Columns("主键字段").AutoIncrementStep = 1

         '要确保列中的值唯一,可将列值设置为在表中添加新行时自动递增。
        '要创建自动递增的 DataColumn,可将列的 AutoIncrement 属性设置为 true。
        '然后,DataColumn 将从 AutoIncrementSeed 属性中定义的值开始,并且,随着各行的添加,
        'AutoIncrement 列的值将按列的 AutoIncrementStep 属性中具有的值增加。
        '对于 AutoIncrement 列,建议将 DataColumn 的 ReadOnly 属性设置为 true

4、执行删除操作时出现的问题:
   问题:   
       开始我参照自动生成的datafrom中代码,用:   Me.BindingContext(dataset1, "表1").RemoveAt(Me.BindingContext(dataset1, "表1").Position)   发现记录指针乱序,根本不是删除我指定的当前记录
  解决方法:
     更改为 引用datagrid的CurrentRowIndex,便可删除当前记录,休码如下:
      Me.BindingContext(dataset1, "表1").RemoveAt(Me.DataGrid1.CurrentRowIndex())
======================================================================
以上为我初学vb.net中所遇到的问题及解决方法(在XP上运行通过),如有不当之处,请各位指出,谢谢!
并在此感谢论坛中解答我问题的各位!!!

本文地址:http://com.8s8s.com/it/it43165.htm