Eingabemaske dynamisch aus XML-Datei erstellen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Eingabemaske dynamisch aus XML-Datei erstellen

    Hi liebe Community,

    ich schreibe an einem Programm, welches aus einer XML-Datei dynamisch eine Eingabemaske bauen soll. Ich habe zuvor noch nicht mit XML gearbeitet. Im Moment funktioniert die If-Abfrage (s. Code) noch nicht, hoffe mir kann jemand sagen wo da der Fehler liegt und wie man das Ganze dann so umsetzt, das es dynamisch funktioniert, also unabhängig davon, wie viele Räume es sind bzw. wie diese Räume dann heißen.
    Letzten Endes soll es dann ungefähr so aussehen, wie im Anhang.

    XML:

    XML-Quellcode

    1. <Durchlaufplan>
    2. <raum1 anzahlpw="" geschlechtw="" anzahlpm="" geschlechtm="" />
    3. <raum2 stuehle="" tische="" />
    4. <raum3 beschreibung="" />
    5. </Durchlaufplan>


    VB:

    VB.NET-Quellcode

    1. Public XMLdatei As Xml.XmlDocument
    2. Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    3. Dim XMLdatei = New Xml.XmlDocument
    4. XMLdatei.Load("C:\Users\michelle.trappen\Desktop\daten.xml")
    5. Dim XMLlesen As Xml.XmlReader = New Xml.XmlTextReader("C:\Users\michelle.trappen\Desktop\daten.xml")
    6. With XMLlesen
    7. Do While .Read
    8. If XmlNodeReader.IsName("raum1") Then
    9. Dim lb As New Label
    10. lb.Text = "Raum 1"
    11. lb.Location = New Point(10, 100)
    12. Me.Controls.Add(lb)
    13. End If
    14. If XmlNodeReader.IsName("anzahlpw") Then
    15. Dim tb As New TextBox
    16. tb.Location = New Point(10, 130)
    17. tb.Height = 22
    18. tb.Width = 30
    19. Me.Controls.Add(tb)
    20. End If
    21. If XmlNodeReader.IsName("geschlechtw") Then
    22. Dim cb As New CheckBox
    23. cb.Location = New Point(50, 130)
    24. cb.Text = "weiblich"
    25. Me.Controls.Add(cb)
    26. End If
    27. If XmlNodeReader.IsName("anzahlpm") Then
    28. Dim tb As New TextBox
    29. tb.Location = New Point(10, 160)
    30. tb.Height = 22
    31. tb.Width = 30
    32. Me.Controls.Add(tb)
    33. End If
    34. If XmlNodeReader.IsName("geschlechtm") Then
    35. Dim cb As New CheckBox
    36. cb.Location = New Point(50, 160)
    37. cb.Text = "männlich"
    38. Me.Controls.Add(cb)
    39. End If
    40. '...
    41. Loop
    42. End With
    43. End Sub


    Ich hoffe ihr könnt mir weiterhelfen!

    Schon mal danke im Voraus,
    rory :)
    Bilder
    • Aufbau_Programm.jpg

      23,01 kB, 459×569, 213 mal angesehen
    Jein, das Ganze soll später einfach dazu dienen, das User die XML im bestimmten Rahmen ändern können und die Eingabemaske sich danach anpasst. Die Eingabefelder sind beim Starten des Programmes leer und werden dann manuell befüllt, später solls dann auch ausgedruckt werden können.
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren
    So, die If-Abfrage funktioniert soweit: 8o

    VB.NET-Quellcode

    1. Dim doc As XDocument = XDocument.Load("C:\Users\michelle.trappen\Desktop\daten.xml")
    2. If CheckElement(doc, "raum1") Then
    3. Dim lb As New Label
    4. lb.Text = "..."
    5. lb.Location = New Point(10, 100)
    6. Me.Controls.Add(lb)
    7. Else
    8. MessageBox.Show("Nicht gefunden")
    9. End If
    10. Function CheckElement(ByVal doc As XDocument, ByVal name As XName) As Boolean
    11. Return doc.Descendants(name).Any()
    12. End Function


    An der XML hab ich die Struktur geändert:

    XML-Quellcode

    1. <Durchlaufplan>
    2. <raum1>
    3. <anzahlpw></anzahlpw>
    4. <geschlechtw></geschlechtw>
    5. <anzahlpm></anzahlpm>
    6. <geschlechtm></geschlechtm>
    7. </rauma>
    8. <raum2>
    9. <stuehle></stuehle>
    10. <tische></tische>
    11. </raum2>
    12. <raum3>
    13. <beschreibung></beschreibung>
    14. </raum3>
    15. </Durchlaufplan>


    Nun ergeben sich mir aber weiter Fragen:
    1. Wie kann ich fürs Label den Namen des gesuchten Knotens verwenden?
    2. Kann man Knoten (in Hinsicht auf die Dynamik) auch über eine ID ansprechen?
    3. Wie kann man den Wert eines Knotens festlegen/abrufen?
    4. Wie kann man die Werte im Coding ändern und speichern?

    Kann mir wer was dazu sagen?
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren

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

    dein Xml ist für Datenverarbeitung strukturell ungeeignet. Die Räume dürfen sich nicht am ElementNamen unterscheiden, sondern der Elementname aller Räume ist <Raum>.
    Ein ElementName in Xml entspricht einer Klasse in Vb, und ich denke alle deine Räume sollten zur selben Klasse gehören.

    Du könntst auch in Betracht ziehen, Datenmodellierung am typisierten Dataset dir zu erarbeiten.
    Weil mir scheint, du brauchst ein Datenmodell, und rohes Xml ist da ziemlich anfällig für Bockmist.
    Vielen Dank für den Hinweis mit den Elementnamen, das ist gut zu wissen, das habe ich jetzt mal direkt geändert.

    Ich möchte das Programm zuallererst mit XML versuchen, danach schaue ich mir die Datenmodellierung am DataSet mal genauer an.
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren
    Ich würde mir für den Zweck eine Klasse in VB anlegen.
    Daraus mit New ein neues Objekt anlegen (instantiieren).
    Dieses Objekt serialisieren.
    Das ergibt eine XML, die du ggf. manuell modifizieren kannst.
    Beim Programmstart diese XML per Deserialisierung einlesen.

    Im Programm arbeitest du nur mit dem VB-Objekt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --