刷新DataGridView vb.net

刷新DataGridView vb.net,vb.net,visual-studio,ms-access,datagridview,Vb.net,Visual Studio,Ms Access,Datagridview,我有DataGridView,它不会刷新。我希望能够通过点击“刷新”按钮来刷新它 我的数据库名为“ProjectDatabase”,我想使用的表名为“SWOT” 我尝试了几种方法,但没有一种有效,如果它确实有效,那么我会遇到新问题,比如每次单击“刷新”时,它都会复制数据。我正在使用MS Access数据库 我尝试了以下编码,它会刷新,但每次单击“刷新”时都会复制数据x2: Private Sub btnRefresh_Click(sender As Object, e As EventArgs)

我有DataGridView,它不会刷新。我希望能够通过点击“刷新”按钮来刷新它

我的数据库名为“ProjectDatabase”,我想使用的表名为“SWOT”

我尝试了几种方法,但没有一种有效,如果它确实有效,那么我会遇到新问题,比如每次单击“刷新”时,它都会复制数据。我正在使用MS Access数据库

我尝试了以下编码,它会刷新,但每次单击“刷新”时都会复制数据x2:

Private Sub btnRefresh_Click(sender As Object, e As EventArgs) Handles btnRefresh.Click
    Refreshdata()
End Sub

Dim myConnection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\ahmed\OneDrive\Desktop\ProjectDatabase2003.mdb")
Dim DS As DataSet = New DataSet
Dim DA As OleDbDataAdapter
Dim tables As DataTableCollection = DS.Tables
Dim source1 As New BindingSource()

Private Sub Refreshdata()
    DA = New OleDbDataAdapter("Select * from SWOT", myConnection)
    DA.Fill(DS, "SWOT_Report")
    Dim view1 As New DataView(tables(0))
    source1.DataSource = view1
    DataGridView1.DataSource = view1
    DataGridView1.Refresh()

End Sub


我认为使用
BindingSource
DataSet
DataAdapter
DataTable
成员(类范围)变量会使代码过于复杂

对于成员变量,将其分解为以下两个:

Dim ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\ahmed\OneDrive\Desktop\ProjectDatabase2003.mdb"
Dim swotBindingSource As BindingSource
请注意,
myConnection
对象已被删除,并替换为连接字符串变量

在表单
New()
方法中添加:

swotBindingSource = New BindingSource()
DataGridView1.DataSource = swotBindingSource
这将设置您的
DataGridView
以将
swotBindingSource
作为其数据源。BindingSource可以在以后过滤数据时使用

最后,将
刷新数据
子项更改为:

Private Sub Refreshdata()
    Dim swotDataTable As New DataTable

    Using conn As New OleDbConnection(ConnectionString)
        Using DA As New OleDbDataAdapter("SELECT * FROM SWOT", conn)
            Dim ds As New DataSet
            DA.Fill(ds, "SWOT_Report")
            swotBindingSource.DataSource = ds.Tables(0)
        End Using
    End Using
End Sub
swotBindingSource
更新时,您应该会在DataGridView中自动看到更新



由于缺少
myConnection
对象,您可能还必须对代码的其余部分进行其他更改,您最好创建一个新的连接对象(类似于在
RefreshData
子部分中的操作)每次当应用程序启动并重新使用同一连接时,您需要使用数据库而不是创建数据库。

您需要做的是在再次填充数据表之前清除数据表。NET不会自动执行此操作

Private Sub Refreshdata()
    '-- clear table before filling
    If DS.Tables("SWOT_Report") IsNot Nothing Then DS.Tables("SWOT_Report").Rows.Clear

    DA = New OleDbDataAdapter("Select * from SWOT", myConnection)
    DA.Fill(DS, "SWOT_Report")
    Dim view1 As New DataView(tables(0))
    source1.DataSource = view1
    DataGridView1.DataSource = view1
    DataGridView1.Refresh()

End Sub

在将view1分配给DataGridView1.DataSource之前,请尝试将DataGridView1.DataSource=Nothing设置为Nothing。在source1.DataSource=view1之前尝试将DataGridView1.DataSource=Nothing设置为Nothing,但仍然重复请参见是的,通过在DA.Fill(…)之前添加DS.Clear()解决了此问题。谢谢