VB.NET:更新D​​ataSource DataTable时更新DataGridView

时间:2016-03-21 20:19:44

标签: vb.net datagridview datasource

当基础DataGridView中的DataTable更新时,我无法更新DataSource

我有一个班级(想象它实际上是在做一些有价值的事情):

Public Class config

    Public Property inputsTable As DataTable
    Public Property outputsTable As DataTable

    Public Sub New()
        inputsTable = New DataTable
        outputsTable = New DataTable

        inputsTable.TableName = "inputs"
        inputsTable.Columns.Add("name")
        inputsTable.Columns.Add("value")

        outputsTable.TableName = "outputs"
        outputsTable.Columns.Add("name")
        outputsTable.Columns.Add("value")
    End Sub

    Public Sub LoadValuesFromConfig(newConfig As config)

        Me.inputsTable = newConfig.inputsTable
        Me.outputsTable = newConfig.outputsTable

        ' do stuff
    End Sub

End Class

...支持Form

Public Class Form1

    Public Property thisConfig As config
    Public Property savedConfig As config

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        thisConfig = New config

        DataGridView1.DataSource = thisConfig.inputsTable
        DataGridView2.DataSource = thisConfig.outputsTable

    End Sub

    ' do stuff      

End Class

虽然DataGridView1DataGridView2分别与myConfig.inputTablemyConfig.outputTable绑定,但如果我通过{{1}更新myConfig.inputTablemyConfig.outputTable } {},myConfig.LoadValuesFromConfig未更新。 (这是因为当我传入新表时,数据源丢失了引用吗?)

我能想到的两种方法:

  1. 我可以这样做而不是DataGridView吗?

    Me.inputsTable = newConfig.inputsTable
  2. 在配置中创建一个事件,在更新表时触发,并在Me.inputsTable.Rows.Clear() For Each row As DataRow In newConfig.inputsTable.Rows Me.inputsTable.ImportRow(row) Next 处理该事件并将Form1重置为DataSource

  3. 任何建议或更好的想法都会很棒!

1 个答案:

答案 0 :(得分:1)

  

这是因为当我在?

中传递新表时数据源丢失了引用

是的,这就是原因。在LoadValuesFromConfig中,您将销毁对现有表的引用。

你有很多选择。

首先,在DataGridViewDataTables

之间加入BindingSource会更加灵活

其次,不是将BindingSource直接绑定到表,而是将其绑定到DataSet,并将DataMember属性设置为表的名称。

然后,您有几个选项可以替换DataTable实例中的数据,最好使用通过DataSet的Tables属性提供的实例。

  1. 您可以使用ReadXml从XML文件重新加载完整的表格。
  2. 您可以使用Load方法并提供(自定义)IDataReader
  3. 的一些实现
  4. 使用Merge方法将另一个DataTable(使用相同的方案)合并到现有的DataTable
  5. 清除行并导入所有行,但效率不高。
  6. 我建议你开始here根据DataSetsBindingSources

    在WinForms中使用数据绑定