Datagridview没有';即使将其数据源重新分配给bindingsource,也不会刷新

本文关键字:分配 bindingsource 刷新 新分配 没有 数据源 Datagridview | 更新日期: 2023-09-27 18:26:39

我有三个不同的数据网格视图,它们都绑定到一个单独的绑定源。当新数据加载到绑定源中时,我想更新数据网格视图。我在这里尝试了普遍接受的解决这个问题的方法:

1.)创建绑定源

2.)将此对象的数据源设置为数据集表。

3.)将DatagridView的数据源设置为绑定源对象。

bindingsrc.DataSource = newDataTable;
// The two lines below were supposedly a dirty solution to refreshing the grid.
dg1.DataSource = null;
dg1.DataSource = bindingsrc;

但是它不起作用。我还尝试重置每个绑定的绑定源:

bindingsrc.ResetBindings();

但无济于事。我知道我得到了正确的新数据,因为一旦我在调试时进入代码,newDataTable就有了正确的数据。所以这是一个数据网格视图不刷新的问题。如果这可能是相关的,我的数据网格视图是面板的一部分,该面板的父级是splitcontainer。我还尝试刷新父级:

this.dataGridView.Parent.Refresh()

没有任何结果。

Datagridview没有';即使将其数据源重新分配给bindingsource,也不会刷新

我找到了问题的解决方案。我不需要处理BindingContext_Changed事件,以及的一般方法

bindingSource1.ResetBindings(false);
dataGridView1.DataSource = null;
bindingSource1.DataSource = null;
bindingSource1.DataSource = mytable;
dataGridView1.DataSource = bindingSource1;

是更新网格的正确方式。

真正的问题:根据我最初的问题:"如果这可能是相关的,我的数据网格视图是一个面板的一部分,其父面板是一个拆分容器。"以下代码行:

 split.Panel2.Controls.Add(new ConfigurableMatrices(comboBox1.SelectedItem.ToString(), comboBox2.SelectedItem.ToString())); 

正在将这个类(ConfigurationMatrix,它中有我的数据网格视图)及其所有控件重新添加到splitcontainer父级的第二个面板中。这行代码是从splitcontainer的另一半执行的。在那之后,我也耳目一新:

split.Panel2.Controls.Add(new ConfigurableMatrices(comboBox1.SelectedItem.ToString(),  
comboBox2.SelectedItem.ToString()));
split.Panel2.Refresh();

然而,通过这种方式,我每次只在顶部添加一个新类(ConfigurationMatrix),由于某种原因,这并没有正确更新。现在对我有效的解决方案是在上面两行代码之前调用Dispose方法:

foreach (Control control in split.Panel2.Controls)
        {
            control.Dispose();
        }
split.Panel2.Controls.Add(new ConfigurableMatrices(comboBox1.SelectedItem.ToString(), comboBox2.SelectedItem.ToString()));
split.Panel2.Refresh();

我希望Dispose方法是解决这个问题的正确方法,并且不会在未来引发其他问题。

在正常情况下不需要刷新。以下操作打开Microsoft NorthWind数据库,将所有表名加载到DropDownStyle=DropDownList的组合框中。在组合框中选择一个表名称,按下按钮,然后加载我们的DataGridView。我绕过了使用数据集,但除了DataGridView的DataMember属性之外,这不会有什么不同,如果不设置,可能会导致手头的问题,所以最好检查DataMember是否正确。

获取表名并为我们提供连接字符串的代码,无论是.accdb还是.mdb

在这段代码中,我们使用SELECT*,但当然,在实际应用程序中,除非需要查看所有字段,否则我们将单独选择特定操作所需的字段。

Imports System.Data.OleDb
Public Class SchemaInfo
    Private Shared _Instance As SchemaInfo
    Public Shared Function GetInstance() As SchemaInfo
        If _Instance Is Nothing Then
            _Instance = New SchemaInfo
        End If
        Return _Instance
    End Function
    Protected Sub New()
    End Sub
    Private Shared _ConnectionString As String
    Public Function ConnectionString() As String
        Return _ConnectionString
    End Function
    Public Function TableNames(ByVal DatabaseName As String) As List(Of String)
        Dim Names As New List(Of String)
        Using cn As New OleDbConnection(BuildConnectionString(DatabaseName))
            _ConnectionString = cn.ConnectionString
            cn.Open()
            Dim dt As DataTable = cn.GetSchema("Tables", New String() {Nothing, Nothing, Nothing, "Table"})
            For Each row As DataRow In dt.Rows
                Names.Add(row.Field(Of String)("Table_Name"))
            Next
        End Using
        Return Names
    End Function
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Shared Function BuildConnectionString(ByVal DatabaseName As String) As String
        If IO.Path.GetExtension(DatabaseName).ToLower = ".accdb" Then
            Dim Builder As New OleDb.OleDbConnectionStringBuilder With
                {
                    .Provider = "Microsoft.ACE.OLEDB.12.0",
                    .DataSource = DatabaseName
                }
            Return Builder.ConnectionString
        ElseIf IO.Path.GetExtension(DatabaseName).ToLower = ".mdb" Then
            Dim Builder As New OleDb.OleDbConnectionStringBuilder With
                {
                    .Provider = "Microsoft.Jet.OLEDB.4.0",
                    .DataSource = DatabaseName
                }
            Return Builder.ConnectionString
        Else
            Throw New Exception("File type not supported")
        End If
    End Function
End Class

表单代码

Imports System.Data.OleDb
Public Class SwitchTableOnBindingSourceForm
    WithEvents bsData As New BindingSource
    Private Sub SwitchTableOnBindingSourceForm_Load(
        sender As Object, e As EventArgs) Handles MyBase.Load
        cboTables.DataSource = SchemaInfo.GetInstance.TableNames(
            IO.Path.Combine(
                AppDomain.CurrentDomain.BaseDirectory, "NorthWind.accdb"))
        DataGridView1.DataSource = bsData
    End Sub
    Private Sub cmdSelectTable_Click(
        sender As Object, e As EventArgs) Handles cmdSelectTable.Click
        Dim dt As New DataTable
        Using cn As New OleDbConnection(SchemaInfo.GetInstance.ConnectionString)
            Using cmd As New OleDbCommand("SELECT * FROM " & cboTables.Text, cn)
                cn.Open()
                dt.Load(cmd.ExecuteReader)
            End Using
        End Using
        bsData.DataSource = dt
    End Sub
End Class