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()
没有任何结果。
我找到了问题的解决方案。我不需要处理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