XML einlesen und mit DataGridview vergleichen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 52 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    ja, du wolltest doch Xml - so ist Xml! :P
    Es gibt da Namespaces, und Xml-Code kann selektive gelesen werden, je nachdem, in welchem Namespace er steht.
    In der Schema-Datei des typDataset (Endung ".xsd") ist genauestens definiert, welches Xml wo auftreten darf, damit die Datei korrekt vom typDataset eingelesen wird.
    Und da findest du auch diesen xmlns-String wieder, als "targetNamespace".

    Also der String-Inhalt hat eiglich keine Bedeutung, aber es ist ein Schlüssel, der auch in der Xsd auftritt, und korrekt eingelesen wird dann nur, was damit übereinstimmt.

    Um das nachzugucken kannste am besten eine Kopie der Xsd umbenennen zu .Xsd.Xml, dann kann man die im VisualStudio als Xml öffnen.
    Zum Abgewöhnen ;)
    ja, mach doch - ist nicht weiter kompliziert. Das einzige zu beachten ist, dass du typisierte DataRows verwendest.
    Die Datentypen Dataset, DataTable, DataRow sind ab sofort todsündenmäßig absolut tabu.
    Du hast ein ContactDts anstatt eines Datasets, hast eine ContactDataTable statt einer DataTable, und hast ContactRows anstatt von DataRows.

    Etwas irritierend mag sein, dass es zwar einen TextFieldParser zum Lesen von Csv gibt, aber zum Schreiben gibts nichts dergleichen (und ist auch nicht nötig). Nimm halt einen StreamWriter, und schreib Zeile für Zeile, was zu schreiben ist.
    gebe mir mühe.

    habe nun eine Listbox hinzugefügt, welche mir eine Liste von Dateien im Order c:\temp listet
    die markierte csv soll dabei eingelesen werden, das mag aber vb anscheinend nicht.
    ändere ich von

    VB.NET-Quellcode

    1. Private _Csv As New FileInfo("c:\\temp\Test.csv")

    in

    VB.NET-Quellcode

    1. Private _Csv As New FileInfo("c:\\temp\" & ListBox1.SelectedItem)

    kommt:

    Quellcode

    1. Fehler 1 "Option Strict On" lässt keine Operanden des Typs "Object" für den &-Operator zu. C:\Users\noxx\Documents\AddressCompleter02\AddressCompleter\frmAddressCompleter.vb 5 150 AddressCompleter


    Oder:
    Ändere ich von

    VB.NET-Quellcode

    1. Using parser = New Microsoft.VisualBasic.FileIO.TextFieldParser(_Csv.FullName)

    in

    VB.NET-Quellcode

    1. Using parser = New Microsoft.VisualBasic.FileIO.TextFieldParser("c:\\temp\" & ListBox1.SelectedItem")

    kommt:

    Quellcode

    1. Fehler 1 Ein Using-Operand vom Typ "Object" muss System.IDisposable implementieren. C:\Users\noxx\Documents\AddressCompleter02\AddressCompleter\frmAddressCompleter.vb 38 15 AddressCompleter
    2. Fehler 2 "Option Strict On" lässt keine Operanden des Typs "Object" für den &-Operator zu. C:\Users\noxx\Documents\AddressCompleter02\AddressCompleter\frmAddressCompleter.vb 38 189 AddressCompleter
    3. Fehler 3 "Option Strict On" lässt spätes Binden nicht zu. C:\Users\noxx\Documents\AddressCompleter02\AddressCompleter\frmAddressCompleter.vb 39 13 AddressCompleter



    Ich weiß wohl, das ich mich ab nächster Woche nochmal intensiv mir vb beschäftigen werden..... ;(

    Gruß
    naja, es ist keine gute Idee, Strings in Listboxen zu tun. Und Listbox.SelectedItem ist nunmal Datentyp Object, und wie der Fehler dir sagt, kann man ein Object nicht einfach an einen String hängen.
    Tatsächlich sollte man Listbox.SelectedItem gar niemals verwenden - ist Anfänger-Kram.

    Also: Keine Strings in die File-Listbox!

    Und ich wunder mich über diesen Pfad: c:\\temp\ - gibts den auf deim System?
    habe mir das video gerade angeschaut....

    dateien werden wie in dem filmchen in der box angezeigt, weiß
    aber noch nicht, wie ich laden soll

    EDIT

    so scheint es zu gehen

    VB.NET-Quellcode

    1. Private Sub LoadCsv()
    2. EinbauteileDts.Clear()
    3. Dim fi = DirectCast(FileInfoBindingSource.Current, FileInfo)
    4. Using parser = New Microsoft.VisualBasic.FileIO.TextFieldParser(fi.FullName)
    5. parser.Delimiters = {","}
    6. While Not parser.EndOfData
    7. Dim entries = parser.ReadFields
    8. EinbauteileDts.Item.AddItemRow(entries(0), entries(1), entries(2), entries(3), entries(4), entries(5))
    9. End While
    10. End Using
    11. End Sub
    hatte ich noch hinzugefügt. So, nun hoffentlich meine beiden letzten Fragen, vermutlich will meiner
    nicht, weils nicht wie du schriebst: typisiert ist....

    Nehme mal Spalte 1
    Da steht zb
    Hund (in Zeile 1)
    Hund (in Zeile 2)
    Katze (in Zeile 3)

    Wollte es nun per Button nummerieren, und zwar so:
    1_Hund
    2_Hund
    1_Katze

    also, neuer Name = Nummerierung von 1 beginnen

    Mein alter Code dazu geht aber nicht mehr:

    VB.NET-Quellcode

    1. Dim j As Integer = 0
    2. For i = 0 To TiereDataGridView.RowCount - 1
    3. j = j + 1
    4. If CStr(TiereDataGridView.Item(0, i).Value) = CStr(TiereDataGridView.Item(0, i + 1).Value) Then
    5. EinbauteileDataGridView.Item(0, i).Value = j & "_" & CStr(TiereDataGridView.Item(0, i).Value)
    6. Else
    7. TiereDataGridView.Item(0, i).Value = j & "_" & CStr(TiereDataGridView.Item(0, i).Value)
    8. j = 0
    9. End If
    10. Next


    Frage 2:
    In Spalte steht steht zb 3.1415927 (als String)
    Versuche diesen Wert zu konvertieren und zu runden mit

    VB.NET-Quellcode

    1. ZahlDataGridView.Item(1, i).Value = Math.Round(Convert.ToDouble(ZahlDataGridView.Item(1, i).Value), 1)

    Aber, aus 3.1415927 wird nicht 3.1, sondern 31415927
    bin ganz irritiert: Ich dachte, du wollest ein Addressbuch als csv abspeichern, und nun bist du iwie mit numerierten Katzen und Hunden unterwegs?

    Ich hab keinen Plan, was das nun soll. Auf jeden Fall ist das herumbuddeln in Datagridviews ebenso tabu wie das rumfuhrwerken mit untypisierten Datasets.

    Verarbeite die Daten da, wo sie sind: im typisierten Dataset. Mach dir keine Sorgen um iwelche DGVs, die sind gebunden, und zeigen, das, was du verarbeitest automatisch korrekt an.

    Aber wie gesagt: Dein Post kommt mir hier eiglich vollkommen deplaziert vor.
    also falls du noch am Export von ContactRow in eine Csv-Datei interessiert bist: So geht eine typisierte Schleife durch die Contacte:

    VB.NET-Quellcode

    1. For Each ct As ContactRow in ContactsDts.Contact
    2. 'hier eine komma-getrennte Zeile in die csv schreiben, unter Verwendung von ct.FirstName, ct.LastName, ct.Street, ct.Hausnummer, ct.Phone etc.
    3. next
    so einfach ist das.

    ErfinderDesRades schrieb:

    also falls du noch am Export von ContactRow in eine Csv-Datei interessiert bist: So geht eine typisierte Schleife durch die Contacte:

    VB.NET-Quellcode

    1. For Each ct As ContactRow in ContactsDts.Contact
    2. 'hier eine komma-getrennte Zeile in die csv schreiben, unter Verwendung von ct.FirstName, ct.LastName, ct.Street, ct.Hausnummer, ct.Phone etc.
    3. next
    so einfach ist das.


    Klar bin ich interssiert, danke. Alles was das Tool zum Abschluß
    bringt :)
    Hast du auch irgendwo eine Tut für die typisierte Datasets.
    Da fehlts mir noch viel an Wissen....

    Gruß
    Jo, da gibts ja auch viel: vier Views-Videos

    Das mit den Relationen zwischen Tabellen brauchst du derzeit garnet, also bereits Film1 schießt übers Ziel hinaus.
    Iwo ein späterer Film geht auch nochmal aufs Coden in typisierter Manier ein - ebenfalls viel anspruchsvoller als einfach eine Schleife durch eine Tabelle zu machen, um csv-Zeilen rauszuhauen.

    Aber die Inspection des generierten Datasets könnte interessant sein, dass du verstehst, wie's kommt, dass eine ContactRow all die Properties hat, die sie braucht.

    ErfinderDesRades schrieb:

    bin ganz irritiert: Ich dachte, du wollest ein Addressbuch als csv abspeichern, und nun bist du iwie mit numerierten Katzen und Hunden unterwegs?

    Ich hab keinen Plan, was das nun soll. Auf jeden Fall ist das herumbuddeln in Datagridviews ebenso tabu wie das rumfuhrwerken mit untypisierten Datasets.

    Verarbeite die Daten da, wo sie sind: im typisierten Dataset. Mach dir keine Sorgen um iwelche DGVs, die sind gebunden, und zeigen, das, was du verarbeitest automatisch korrekt an.

    Aber wie gesagt: Dein Post kommt mir hier eiglich vollkommen deplaziert vor.



    Habe mir nun ein paar Videos angeschaut. Versuche zu begreifen.

    Es ging hier nicht um Adressbuch, das sollte nur ein Beispiel sein.
    Genauso wie die anderen beiden Beispiele. Wollte gerne das ganze nach
    und nach abhandeln, alles auf einmal hätte mich dann verwirrt. Einfachere
    Beispiele fielen mir nicht ein.

    Meine beiden Fragen aus #30 konnte ich mir über das Wochenende leider nicht selbst
    beantworten.

    Gruß
    Hmm - sieht aus, als sei meine Arbeit hier wohl umsonst :(
    Habe dir ein typisiertes Dataset gebastelt, aber du ziehst es vor, untypisiert in DatagridViewsen rumzubuddeln.

    Eine Frage1 finde ich nicht in dem Post, und Frage2 weiß ich auch nicht - sieht mir richtig aus, wie du rundest. - achso - vlt. meinst du mit Frage1, Strings innerhalb einer bestimmten Spalte zu verändern.

    Ja, ist mit Leichtigkeit möglich, aber bitte nicht in DataGridViewsen.
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    danke, das hat mir schonmal geholfen.

    hier hapert es aber noch:

    VB.NET-Quellcode

    1. Private Sub RoundXyzToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RoundXyzToolStripMenuItem.Click
    2. Dim runden = EinbauteileDts.Item
    3. For i = 0 To runden.Count - 1
    4. Dim tmp_x As Double = Convert.ToDouble(runden(i)._x_wert)
    5. runden(i)._x_wert = Convert.ToString(Math.Round(tmp_x, 2))
    6. Next
    7. End Sub


    Die Daten liegen als String vor, zb 12.123456789
    Müsste es runden, aber irgendwie haut das mit Punkt-Komma nicht hin.

    Aus -1841.3628583813897 wird -1,84136285838139E+16
    runden ist eine extrem schlechte Benamung für eine DataTable

    Ebenso Item - kannst du dir da nix ausdenken, was dem, was es darstellt, besser entspricht?

    Und wenn das Zahlen sind, da in der Spalte, dann lege diese Spalte als Double an. Mit Strings zu rechnen geht eigentlich immer daneben - früher oder später.