Fehlende Eigenschaft in einer ObservableCollection

  • WPF

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

    Fehlende Eigenschaft in einer ObservableCollection

    Hallo Zusammen
    Ich komm nicht mehr weiter ... ?(
    Ausgangslage ist folgendes XML:

    XML-Quellcode

    1. <PRD>
    2. <GTIN>7680002940011</GTIN>
    3. <PRODNO>002941</PRODNO>
    4. <DSCRD>Foie Sérocytol, suppositoire</DSCRD>
    5. </PRD>
    6. <PRD>
    7. <DSCRD>SARIDON N forte Filmtabl 400 mg 10 Stk</DSCRD>
    8. <GTIN>7680563580237</GTIN>
    9. </PRD>


    Es fällt auf, dass nicht immer jedes Element dabei ist. Es fehlt PRODNO im zweiten Datensatz.
    Ich sollte die Einträge in Textboxen eintragen. Sofern immer jedes Element dabei ist, funktioniert das auch.
    Sobald aber ein Element gänzlich fehlt, kommt gar nix. Wie würdet ihr das angehen? Ich lese die list aus und möchte die Textboxen abfüllen.

    Mein VB Konstrukt:

    VB.NET-Quellcode

    1. Public Class Medikamente
    2. Public Property NameMedic() As [String]
    3. Get
    4. Return m_NameMedic
    5. End Get
    6. Set(value As [String])
    7. m_NameMedic = value
    8. End Set
    9. End Property
    10. Private m_NameMedic As [String]
    11. Public Property EAN() As [String]
    12. Get
    13. Return m_EAN
    14. End Get
    15. Set(value As [String])
    16. m_EAN = value
    17. End Set
    18. End Property
    19. Private m_EAN As [String]
    20. Public Property MedicNr() As [String]
    21. Get
    22. Return m_MedicNr
    23. End Get
    24. Set(value As [String])
    25. m_MedicNr = value
    26. End Set
    27. End Property
    28. Private m_MedicNr As [String]
    29. Public Sub New(NameMedic As [String], EAN As [String], MedicNr As String)
    30. Me.NameMedic = NameMedic
    31. Me.EAN = EAN
    32. Me.MedicNr = MedicNr
    33. End Sub
    34. End Class
    35. Dim list As New ObservableCollection(Of Medikamente)
    36. Dim medis = From county In document.Root.Elements("PRD")
    37. From MedicNr In county.Elements("PRODNO")
    38. From NameMedic In county.Elements("DSCRD")
    39. From EAN In county.Elements("GTIN")
    40. For Each m In medis
    41. list.Add(New Medikamente(NameMedic:=m.NameMedic, EAN:=m.EAN, MedicNr:=m.MedicNr))
    42. Next
    Wie genau serialisierst du? Mit dem Net FW XML Serializer oder einem externen tool?
    wenn du mit FW internen ding arbeitest kannst du xmlserialize attribute setzten...einfach ma googlen
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Hallo
    Ich serialisiere nicht speziell.
    Habe eine Klasse "Medikamente" und eine "ObservableCollection" die list heisst und an die Klasse gebunden ist, dann lese ich das XML aus und befülle die ObservableCollection.
    Problem: Wenn ein Element im XML gänzlich fehlt, dann liest es mir die vorhandenen Elemente auch nicht aus.
    Also ich würd, wenn ich wie in deinem fall aus xml dateien wiederobjekte erstellen müsste, das ganze ned über linq sondern mit xmlserializer deserialisieren.
    Is bei dir für jedes medi 1e einzelne xml datei oder sind alle/viele medis in einer einzelnen xml datei?
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    VB.NET-Quellcode

    1. Dim medis = From county In document.Root.Elements("PRD")
    2. From MedicNr In county.Elements("PRODNO")
    3. From NameMedic In county.Elements("DSCRD")
    4. From EAN In county.Elements("GTIN")
    Das ist halt iwie eine sehr komische Linq-Query, mit verschachtelten From-Abschnitten - ich weiß grad garnet wie die sich verhält.
    Rufe nur die Medis ab, und gehe die Medis dann durch.

    Aber hier scheint mir auch wieder Option Strict Off am Werk - bei mir kompiliert der gezeigte Code erst garnet
    Lösung gefunden:
    Ich prüfe mit Any ob das Element vorhanden ist, wenn True, dann lese ich es aus. In diesem Fall wo eine Sequenz max. 3 Elemente hat, geht das gut so.

    VB.NET-Quellcode

    1. Dim medis = From county In documentxml.Elements("PRD") Where CStr(county.Element("DSCRD")) = args.SelectedItem
    2. Select county
    3. For Each line In medis
    4. Dim haselemnt As Boolean = line.Elements("PRODNO").Any()
    5. Dim haselemnt1 As Boolean = line.Elements("GTIN").Any()
    6. If haselemnt = True Then
    7. txtMEDICNr.Text = line.Element("PRODNO").Value
    8. Else
    9. txtMEDICNr.Text = ""
    10. End If
    11. If haselemnt1 = True Then
    12. txtEAN.Text = line.Element("GTIN").Value
    13. Else
    14. txtEAN.Text = ""
    15. End If
    16. Next
    mach doch einfach

    VB.NET-Quellcode

    1. For Each m In document.Root.<PRD>
    2. list.Add(New Medikamente(m.<DSCRD>.Value, m.<GTIN>.Value, m.<PRODNO>.Value))
    3. Next
    Value ergibt bei Fehlen des Elements Nothing, und wenn ein medikament keine Descr hat, wird ihm als Name halt Nothing eingetragen. Die anderen Werte gehen so aber nicht verloren.
    (Ist ja eh eigenartig, Descr als Name zu nehmen, Descr scheint doch eher was mit Description, Beschreibung zu tun zu haben.)