2017-11-07 1 views
0

프로젝트 데이터를 저장하기 위해 XML 파일을 만들려고합니다. 1 DGV에서 데이터를 입력하면 작동하지만 데이터 세트에 다른 테이블을 추가하려고하면 첫 번째 테이블이 덮어 쓰여지고 XML 파일의 두 번째 DGV 테이블 열 머리글 만 가져옵니다. 그래서 하나의 XML 파일에서 여러 DGV의 데이터를 가져 오는 방법을 알고 싶습니다. 또한 동일한 파일에 일부 텍스트 상자 데이터를 추가해야합니다.VB.net 데이터 집합에 여러 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 
+0

에 BindingSource에 사용합니다. 관련성이있는 것으로 좁혀 야합니다. 당신은 이것을 읽어야한다. (https://stackoverflow.com/help/mcve) – jmcilhinney

+0

주된 문제는'CreateDatasetTable'에서 당신이 그것을 부를 때마다 새로운 데이터 셋을 생성하고 리턴 할 때마다 매번 데이터 셋을 덮어 쓰는 것이다. . 'SaveData' 인스턴스에서 해당 datatables를 관리하고 로컬'dataset1' 변수를 제거해야합니다. – Crowcoder

답변

0

내가 저장하려는 데이터를 나타내는 사용자 지정 개체를 사용합니다 : 이것은 내가 현재 사용하고있는 코드입니다. 그래서 당신의 텍스트 데이터를위한 문자열 프로퍼티와 데이터 셋의 배열 (또는 List, IEnumerable)을 가진 타입을 만들 것입니다. 나는 그 객체를 직렬화 할 것이다. JSON을 사용 하겠지만 직렬화 방법은 사용자가 결정합니다.

Public Class ProjectData 

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

End Class 
0

Visual Studio에서 DataSet 디자이너를 사용하여 테이블을 정의하면 "강력한 형식의"DataSet이 만들어집니다. 즉, DataSet에서 상속하지만 이미 테이블 스키마가 정의되어있는 클래스입니다. 이렇게하면 dataSet.Table ("TableName") 대신 dataSet.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 
관련 문제