【问题标题】:VB.net multiple DGV's in datasetVB.net 数据集中的多个 DGV
【发布时间】:2018-04-19 17:27:40
【问题描述】:

我正在尝试制作一个 XML 文件来保存项目数据。输入来自 1 个 DGV 的数据是可行的,但是当我尝试将另一个表添加到数据集中时,第一个表会被覆盖,而我得到的只是 XML 文件中第二个 DGV 的表列标题。所以我想知道如何在一个 XML 文件中从多个 DGV 中获取数据?还需要在同一个文件中添加一些文本框数据。这是我目前使用的代码:

Public Class Dimensioneringsapp

'data sets voor het opslaan en openen van data
Dim path As String
Dim SaveData As DataSet


   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    SaveData = CreateDatasetTable(Rekenwaardes, "Reken")
    SaveData = CreateDatasetTable(XYinput, "input")

End Sub

  'load
Private Sub OpenProjectToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpenProjectToolStripMenuItem.Click

    If opendialog.ShowDialog = Windows.Forms.DialogResult.OK Then
        path = opendialog.FileName

        'voer het bestand in de tabellen
        LoadFromXMLfile(path)

    End If


End Sub

'save
Private Sub SaveToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SaveToolStripMenuItem.Click

        If saveFileDialog1.ShowDialog() = DialogResult.OK Then
            path = saveFileDialog1.FileName

            SaveData.Clear()
            AddDataToDataSet(SaveData, Rekenwaardes, "reken")
            AddDataToDataSet(SaveData, XYinput, "input")
            SaveToXMLFile(path, SaveData)

        End If

End Sub

'Create Data set
Private Function CreateDatasetTable(g As DataGridView, t As String) As DataSet
    Dim dataset1 As New DataSet("SaveData")
    Dim table1 As New DataTable(t)

    'counter
    Dim i As Integer = 0

    Do While i < g.ColumnCount
        table1.Columns.Add(g.Columns(i).HeaderText)

        i = i + 1
    Loop

    dataset1.Tables.Add(table1)

    Return dataset1
End Function

Private Sub AddDataToDataSet(d As DataSet, g As DataGridView, t As String)

    'counter voor doorlopen tabel
    Dim i As Integer = 0
    Dim c As Integer = 0

    Do While i < g.RowCount
        Do While c < g.ColumnCount 
            d.Tables(t).Rows.Add(g(c, i).Value)
            c = c + 1
        Loop
        i = i + 1
        Loop

End Sub


Private Sub SaveToXMLFile(filename As String, d As DataSet)
    'd.WriteXml(filename, XmlWriteMode.WriteSchema)
    Dim ser As XmlSerializer = New XmlSerializer(GetType(DataSet))
    Dim writer As TextWriter = New StreamWriter(filename)
    ser.Serialize(writer, d)
    writer.Close()
End Sub

Private Sub LoadFromXMLfile(filename As String)
    If System.IO.File.Exists(filename) Then
        Dim xmlSerializer As XmlSerializer = New XmlSerializer(SaveData.GetType)
        Dim readStream As FileStream = New FileStream(filename, FileMode.Open)

        Rekenwaardes.Columns.Clear()

        SaveData = CType(xmlSerializer.Deserialize(readStream), DataSet)
        readStream.Close()
        'SaveData.ReadXml(filename, XmlReadMode.ReadSchema)
        Rekenwaardes.DataSource = SaveData.Tables("Reken")              
        XYinput.DataSource = SaveData.Tables("input")


    End If
End Sub
End Class

【问题讨论】:

  • 发布的代码实在太多了。您确实需要将其范围缩小到相关的内容。你应该read this
  • 您的主要问题是,在CreateDatasetTable 中,您每次调用它时都会创建一个新数据集,然后返回它,每次都会覆盖您的数据集。您应该只管理 SaveData 实例中的数据表,摆脱本地的 dataset1 变量。

标签: xml vb.net datagridview dataset


【解决方案1】:

如果在Visual Studio中使用DataSet Designer来定义表,它将创建一个“强类型”数据集。也就是说,从 DataSet 继承但已经为您定义了表模式的类。这为您提供了能够访问DataSet.Tablename而不是DataSet.Table(“TableName”)等优点。

如果您对 XML 的格式不是很挑剔,那么您可以只使用 DataSet 上的 ReadXml 和 WriteXml 方法来序列化整个内容。

然后在DataGridViews上使用绑定源

Dim bs1 As New BindingSource
bs1.DataSource = myDataSet
bs1.DataMember = "Table1"  
dgv1.DataSource = bs1

Dim bs2 As New BindingSource
bs2.DataSource = myDataSet
bs2.DataMember = "Table2"  
dgv2.DataSource = bs2

【讨论】:

    【解决方案2】:

    我会使用一个自定义对象来代表您要保存的数据。因此,我将为您的文本数据创建一个具有字符串属性的类型,以及一个数据集的数组(或列表或 IEnumerable)。然后我会序列化那个对象。我会使用 JSON,但是序列化的方法取决于你。

    Public Class ProjectData
    
        Public Property Text As String
        Public Property DataSets As New List(Of DataSet)
    
    End Class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2013-07-02
      • 2021-11-25
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多