Datagridview 和 access 数据库仅在单击不同行后更新

Datagridview and access database only updates after clicking a different row

我正在读取访问数据库并在数据网格视图中填充信息。我的表单有一个 DGV 和 3 个按钮。 按钮一将 selected 行复制到 datetimepicker 控件。 按钮二将更新的日期时间选择器值复制回 DVG 第三个按钮执行更新(将信息写回数据库)。

我的问题是,如果我在按下按钮三之前 select 不同的行,则信息只会在数据库中更新。在这两种情况下我都没有收到任何错误消息。

下面是我的代码。数据库只有 2 列(名称和出生日期 - 即 date/time)。

Public Class Form1

    Dim dbConn As New OleDb.OleDbConnection
    Dim sDataset As New DataSet
    Dim sDataAdapter As OleDb.OleDbDataAdapter
    Dim sql As String
    Dim iTotalRows As Integer
    Dim sShipTypeFilter As String
    Dim sBuildingFilter As String
    Dim sCustSuppFilter As String
    Dim sStatusFilter As String
    Dim sDayFilter As String
    Dim dv As New DataView


    Sub myDBConn()
        dbConn.ConnectionString = "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\terry\Documents\Database1.accdb"

        Debug.Print("Start:" & DateAndTime.Now.ToString)

        dbConn.Open()
        sql = "select * from TableX"
        sDataAdapter = New OleDb.OleDbDataAdapter(Sql, dbConn)
        sDataAdapter.Fill(sDataset, "MyTable")
        dbConn.Close()
        iTotalRows = sDataset.Tables("MyTable").Rows.Count
        Debug.Print("Rows from Access:" & iTotalRows)

        Debug.Print("End:" & DateAndTime.Now.ToString)
    End Sub

    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Call myDBConn()

        Debug.Print("DVG1 row count before binding:" & DataGridView1.Rows.Count)
        'dv = New DataView(sDataset.Tables(0), "Shipment = 'Regular' and Building = 'CSE'", "Company DESC", DataViewRowState.CurrentRows)
        dv = sDataset.Tables(0).DefaultView
        Debug.Print("DataView count:" & dv.Count)
        DataGridView1.DataSource = dv

        Debug.Print("DVG1 Rows:" & DataGridView1.Rows.Count)
        DataGridView1.Columns("DOB").DefaultCellStyle.Format = "hh:mm tt"

        DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        dtp1.Value = DataGridView1.SelectedRows(0).Cells("DOB").Value
    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        DataGridView1.SelectedRows(0).Cells("DOB").Value = dtp1.Value
    End Sub

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
        Debug.Print("switched row")
        Me.Visible = False
        Dim sqlcb As New OleDb.OleDbCommandBuilder(sDataAdapter)
        sDataAdapter.Update(sDataset.Tables("MyTable"))
        Me.Close()
    End Sub
End Class

更新前您需要Endedit。这意味着您需要为 datagridview 添加 Endedit。

这将是您的代码:

Debug.Print("switched row")
Me.Visible = False
Dim sqlcb As New OleDb.OleDbCommandBuilder(sDataAdapter)
Datagridview1.EndEdit() 
sDataAdapter.Update(sDataset.Tables("MyTable"))
Me.Close()

编辑 1:

    Dim dt As New DataTable        

    dbConn.Open()
    sDataset.Tables.Add(dt)
    sDataAdapter = New OleDbDataAdapter("Select * from TableX", dbConn)
    sDataAdapter.Update(dt)
    dbConn.Close()

我明白了 - 感谢 Stef 让我走上正轨。 我的 DGV 仅以编程方式更新(而不是通过用户编辑),因此我更新了按钮 2 的代码以设置编辑模式、开始编辑、更新选定的 DVG 行并结束编辑:

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically
    DataGridView1.BeginEdit(True)
    DataGridView1.SelectedRows(0).Cells("DOB").Value = dtp1.Value
    DataGridView1.EndEdit()
End Sub

进行此修改后 - 我的 datadapter.update 命令有效!!