【问题标题】:Binding a Data Set/Table to a DataGridView将数据集/表绑定到 DataGridView
【发布时间】:2018-03-28 17:04:29
【问题描述】:

我目前正在编写一个链接到数据库的简单库存控制 Visual Basic 程序。

Here's what it looks like so far.

表单在 DataGrid 视图中显示数据,我正在尝试在我正在使用的数据库中更改数据(使用 SQL)时自动刷新我的 DataGridView。

在做了一些研究后,我发现最好的方法是将数据表(使用 BindingSource)绑定到 DataGridView

但是我正在努力实现这一点,因为我尝试过的每个实现都会导致一个空白的 DataGridView,如果有人可以帮助我,我将不胜感激。

代码如下:

Imports System.Data.OleDb

Public Class Form1
Public connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=dbStock.accdb"
Public conn As New OleDb.OleDbConnection(connectionString)

Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.TblStockControlTableAdapter.Fill(Me.DbStockDataSet.tblStockControl)

    For i As Integer = 1 To 5
        ComboBoxQty1.Items.Add(i)
        ComboBoxQty2.Items.Add(i)
    Next

    Dim SqlQuery As String = "Select tblStockControl.[EggType] FROM tblStockControl"
    Dim da As OleDbDataAdapter = New OleDbDataAdapter(SqlQuery, conn)
    Dim ds As DataSet = New DataSet
    da.Fill(ds, "tblStockControl")
    Dim dt As DataTable = ds.Tables("tblStockControl")
    'DataGridView1.DataSource = dt

    For Each row As DataRow In dt.Rows
        ComboBoxAdd.Items.Add(row.Item(0))
    Next

    For Each row As DataRow In dt.Rows
        ComboBoxTake.Items.Add(row.Item(0))
    Next

End Sub

Private Sub btnAddEgg_Click(sender As Object, e As EventArgs) Handles btnAddEgg.Click

    conn.Open()

    Dim SqlQuery As String = "Select tblStockControl.[Quantity] FROM tblStockControl WHERE EggType = '" & ComboBoxAdd.Text & "'"

    Dim da As OleDbDataAdapter = New OleDbDataAdapter(SqlQuery, conn)
    Dim ds As DataSet = New DataSet
    da.Fill(ds, "tblStockControl")
    Dim dt As DataTable = ds.Tables("tblStockControl")

    Dim qty As Integer = 0

    For Each row As DataRow In dt.Rows
        For Each column As DataColumn In dt.Columns
            qty = row(column)
        Next
    Next

    Dim NewQty As Integer = qty + CInt(ComboBoxQty2.Text)

    UpdateAddQty(NewQty)

    conn.Close()

End Sub

Function UpdateAddQty(ByRef NewQty As Integer) As Integer
    Dim SqlUpdate As String = "UPDATE tblStockControl SET Quantity = '" & NewQty & "' WHERE EggType = '" & ComboBoxAdd.Text & "'"

    Dim SqlCommand As New OleDbCommand
    With SqlCommand
        .CommandText = SqlUpdate
        .Connection = conn
        .ExecuteNonQuery()
    End With

    Return (Nothing)
End Function

Private Sub btnViewStock_Click(sender As Object, e As EventArgs) Handles btnViewStock.Click
    'Add code to open Access file.
End Sub

Private Sub btnTakeEgg_Click(sender As Object, e As EventArgs) Handles btnTakeEgg.Click
    conn.Open()

    Dim SqlQuery As String = "Select tblStockControl.[Quantity] FROM tblStockControl WHERE EggType = '" & ComboBoxTake.Text & "'"

    Dim da As OleDbDataAdapter = New OleDbDataAdapter(SqlQuery, conn)
    Dim ds As DataSet = New DataSet
    da.Fill(ds, "tblStockControl")
    Dim dt As DataTable = ds.Tables("tblStockControl")

    Dim qty As Integer = 0

    For Each row As DataRow In dt.Rows
        For Each column As DataColumn In dt.Columns
            qty = row(column)
        Next
    Next

    Dim NewQty As Integer = CInt(ComboBoxQty1.Text) - qty

    UpdateTakeQty(NewQty)

    conn.Close()
End Sub

Function UpdateTakeQty(ByRef NewQty As Integer) As Integer
    Dim SqlUpdate As String = "UPDATE tblStockControl SET Quantity = '" & NewQty & "' WHERE EggType = '" & ComboBoxTake.Text & "'"

    Dim SqlCommand As New OleDbCommand
    With SqlCommand
        .CommandText = SqlUpdate
        .Connection = conn
        .ExecuteNonQuery()
    End With

    Return (Nothing)
End Function

结束类

【问题讨论】:

  • 哪一行代码设置了dgv的DataSource?
  • @AndrewMortimer 原来的 DataGridView 的 DataSource 是在设计器中设置的(在 DataGridView 的任务下),所以我认为没有显示那行代码。
  • 如果你使用的是DataSet,那么就使用它,否则就不要使用它。不要混搭。您显然确实输入了DataSet,因为您使用的是表格适配器。在这种情况下,您应该只通过 DataSet 和/或那些表适配器与数据库交互。如果您需要默认功能以外的功能,则在设计器中打开DataSet 并进行适当的修改。了解如何使用表适配器here
  • 要从数据库中检索数据,请在适当的表适配器上调用 Fill。就是这样,仅此而已。这将填充适当的DataTable,并且如果DataTable 已经绑定到DataGridView,那么将显示检索到的数据。

标签: vb.net visual-studio data-binding datagridview


【解决方案1】:

如果您使用的是 DataTable ,则重置 DataGridView 的数据源。我的意思是您需要再次从数据库中读取数据。 :

'Do this every time you add/Update a data
Dim da As OleDbDataAdapter = New OleDbDataAdapter(SqlQuery, conn)
Dim ds As DataSet = New DataSet
da.Fill(ds, "tblStockControl")
Dim dt As DataTable = ds.Tables("tblStockControl")

或者您可以为添加到数据库的每个数据创建一行:

 'Do this every time you add a data
 DataGridViewRow row = (DataGridViewRow)DataGridView1.Rows[0].Clone()
 row.Cells[0].Value = "Alex"
 row.Cells[1].Value = "Jordan"
 DataGridView1.Rows.Add(row)

【讨论】:

  • 我每次更新数据后都尝试添加“DataGridView1.DataSource = dt”,但由于某种原因,数量列仍然为空白。还有什么建议吗?
  • 或者你为什么不选择我的第二个选项?
  • 对你有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多