DataTable / List(of...) / Combobox / DataGridview

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Morrison.

    DataTable / List(of...) / Combobox / DataGridview

    Hallo!

    Also ich hab da so meine Probleme mit meinem typisiertem DataTable!
    Ich lese ein JSONString und deserialisiere ihn mittels der generierten Klassen! Klappt auch alles korrekt..
    ..jedoch bekomme ich es nicht hin von diesem DataTable meine DataGridView zu füllen!
    Das ich, wenn ich in meiner Deserialisierungs-Klasse eine List(of String) hab, diese nicht einfach als Combobox darstellen kann enttäuscht mich ein bisschen!

    Wie bewerkstelligt Ihr solche Umwandlungen?

    Ich hatte das mal irgend wie geschafft das ich im DataTable das betreffende Feld als Object deklariert hab..und dann dieses Object zum füllen der Combobox verwendet hab..
    ..aber iwie komm ich nich auf den richtigen Trichter!

    Also wie kann ich mein JSON das viele List(of) enthält am besten in nem DataGridview mit Comboboxen darstellen?!?

    Mach ich das am besten ohne DataTables?


    VB.NET-Quellcode

    1. ​JsonConvert.DeserializeObject(Of JSONCompact.Root)(json)


    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Public Class Artist
    2. <JsonConstructor>
    3. Public Sub New(
    4. <JsonProperty("id")> ByVal id As String,
    5. <JsonProperty("name")> ByVal name As String)
    6. Me.Id = id
    7. Me.Name = name
    8. End Sub
    9. <JsonProperty("id")>
    10. Public ReadOnly Id As String
    11. <JsonProperty("name")>
    12. Public ReadOnly Name As String
    13. End Class
    14. Public Class _Date
    15. <JsonConstructor>
    16. Public Sub New(
    17. <JsonProperty("year")> ByVal year As Integer,
    18. <JsonProperty("day")> ByVal day As Integer,
    19. <JsonProperty("month")> ByVal month As Integer)
    20. Me.Year = year
    21. Me.Day = day
    22. Me.Month = month
    23. End Sub
    24. <JsonProperty("year")>
    25. Public ReadOnly Year As Integer
    26. <JsonProperty("day")>
    27. Public ReadOnly Day As Integer
    28. <JsonProperty("month")>
    29. Public ReadOnly Month As Integer
    30. End Class
    31. Public Class Track
    32. <JsonConstructor>
    33. Public Sub New(
    34. <JsonProperty("artists")> ByVal artists As List(Of Artist),
    35. <JsonProperty("id")> ByVal id As String,
    36. <JsonProperty("position")> ByVal position As Integer,
    37. <JsonProperty("title")> ByVal title As String)
    38. Me.Artists = artists
    39. Me.Id = id
    40. Me.Position = position
    41. Me.Title = title
    42. End Sub
    43. <JsonProperty("artists")>
    44. Public ReadOnly Artists As List(Of Artist)
    45. <JsonProperty("id")>
    46. Public ReadOnly Id As String
    47. <JsonProperty("position")>
    48. Public ReadOnly Position As Integer
    49. <JsonProperty("title")>
    50. Public ReadOnly Title As String
    51. End Class
    52. Public Class Medium
    53. <JsonConstructor>
    54. Public Sub New(
    55. <JsonProperty("format")> ByVal format As String,
    56. <JsonProperty("position")> ByVal position As Integer,
    57. <JsonProperty("track_count")> ByVal trackCount As Integer,
    58. <JsonProperty("tracks")> ByVal tracks As List(Of Track),
    59. <JsonProperty("title")> ByVal title As String)
    60. Me.Format = format
    61. Me.Position = position
    62. Me.TrackCount = trackCount
    63. Me.Tracks = tracks
    64. Me.Title = title
    65. End Sub
    66. <JsonProperty("format")>
    67. Public ReadOnly Format As String
    68. <JsonProperty("position")>
    69. Public ReadOnly Position As Integer
    70. <JsonProperty("track_count")>
    71. Public ReadOnly TrackCount As Integer
    72. <JsonProperty("tracks")>
    73. Public ReadOnly Tracks As List(Of Track)
    74. <JsonProperty("title")>
    75. Public ReadOnly Title As String
    76. End Class
    77. Public Class Releaseevent
    78. <JsonConstructor>
    79. Public Sub New(
    80. <JsonProperty("country")> ByVal country As String,
    81. <JsonProperty("date")> ByVal _date As _Date)
    82. Me.Country = country
    83. Me._Date = _date
    84. End Sub
    85. <JsonProperty("country")>
    86. Public ReadOnly Country As String
    87. <JsonProperty("date")>
    88. Public ReadOnly _Date As _Date
    89. End Class
    90. Public Class Release
    91. <JsonConstructor>
    92. Public Sub New(
    93. <JsonProperty("artists")> ByVal artists As List(Of Artist),
    94. <JsonProperty("country")> ByVal country As String,
    95. <JsonProperty("date")> ByVal _date As _Date,
    96. <JsonProperty("id")> ByVal id As String,
    97. <JsonProperty("medium_count")> ByVal mediumCount As Integer,
    98. <JsonProperty("mediums")> ByVal mediums As List(Of Medium),
    99. <JsonProperty("releaseevents")> ByVal releaseevents As List(Of Releaseevent),
    100. <JsonProperty("title")> ByVal title As String,
    101. <JsonProperty("track_count")> ByVal trackCount As Integer)
    102. Me.Artists = artists
    103. Me.Country = country
    104. Me._Date = _date
    105. Me.Id = id
    106. Me.MediumCount = mediumCount
    107. Me.Mediums = mediums
    108. Me.Releaseevents = releaseevents
    109. Me.Title = title
    110. Me.TrackCount = trackCount
    111. End Sub
    112. <JsonProperty("artists")>
    113. Public ReadOnly Artists As List(Of Artist)
    114. <JsonProperty("country")>
    115. Public ReadOnly Country As String
    116. <JsonProperty("date")>
    117. Public ReadOnly _Date As _Date
    118. <JsonProperty("id")>
    119. Public ReadOnly Id As String
    120. <JsonProperty("medium_count")>
    121. Public ReadOnly MediumCount As Integer
    122. <JsonProperty("mediums")>
    123. Public ReadOnly Mediums As List(Of Medium)
    124. <JsonProperty("releaseevents")>
    125. Public ReadOnly Releaseevents As List(Of Releaseevent)
    126. <JsonProperty("title")>
    127. Public ReadOnly Title As String
    128. <JsonProperty("track_count")>
    129. Public ReadOnly TrackCount As Integer
    130. End Class
    131. Public Class Releasegroup
    132. <JsonConstructor>
    133. Public Sub New(
    134. <JsonProperty("artists")> ByVal artists As List(Of Artist),
    135. <JsonProperty("id")> ByVal id As String,
    136. <JsonProperty("releases")> ByVal releases As List(Of Release),
    137. <JsonProperty("title")> ByVal title As String,
    138. <JsonProperty("secondarytypes")> ByVal secondarytypes As List(Of String),
    139. <JsonProperty("type")> ByVal type As String)
    140. Me.Artists = artists
    141. Me.Id = id
    142. Me.Releases = releases
    143. Me.Title = title
    144. Me.Secondarytypes = secondarytypes
    145. Me.Type = type
    146. End Sub
    147. <JsonProperty("artists")>
    148. Public ReadOnly Artists As List(Of Artist)
    149. <JsonProperty("id")>
    150. Public ReadOnly Id As String
    151. <JsonProperty("releases")>
    152. Public ReadOnly Releases As List(Of Release)
    153. <JsonProperty("title")>
    154. Public ReadOnly Title As String
    155. <JsonProperty("secondarytypes")>
    156. Public ReadOnly Secondarytypes As List(Of String)
    157. <JsonProperty("type")>
    158. Public ReadOnly Type As String
    159. End Class
    160. Public Class Recording
    161. <JsonConstructor>
    162. Public Sub New(
    163. <JsonProperty("artists")> ByVal artists As List(Of Artist),
    164. <JsonProperty("duration")> ByVal duration As Integer,
    165. <JsonProperty("id")> ByVal id As String,
    166. <JsonProperty("releasegroups")> ByVal releasegroups As List(Of Releasegroup),
    167. <JsonProperty("title")> ByVal title As String)
    168. Me.Artists = artists
    169. Me.Duration = duration
    170. Me.Id = id
    171. Me.Releasegroups = releasegroups
    172. Me.Title = title
    173. End Sub
    174. <JsonProperty("artists")>
    175. Public ReadOnly Artists As List(Of Artist)
    176. <JsonProperty("duration")>
    177. Public ReadOnly Duration As Integer
    178. <JsonProperty("id")>
    179. Public ReadOnly Id As String
    180. <JsonProperty("releasegroups")>
    181. Public ReadOnly Releasegroups As List(Of Releasegroup)
    182. <JsonProperty("title")>
    183. Public ReadOnly Title As String
    184. End Class
    185. Public Class Result
    186. <JsonConstructor>
    187. Public Sub New(
    188. <JsonProperty("id")> ByVal id As String,
    189. <JsonProperty("recordings")> ByVal recordings As List(Of Recording),
    190. <JsonProperty("score")> ByVal score As Double)
    191. Me.Id = id
    192. Me.Recordings = recordings
    193. Me.Score = score
    194. End Sub
    195. <JsonProperty("id")>
    196. Public ReadOnly Id As String
    197. <JsonProperty("recordings")>
    198. Public ReadOnly Recordings As List(Of Recording)
    199. <JsonProperty("score")>
    200. Public ReadOnly Score As Double
    201. End Class
    202. Public Class Root
    203. <JsonConstructor>
    204. Public Sub New(
    205. <JsonProperty("results")> ByVal results As List(Of Result),
    206. <JsonProperty("status")> ByVal status As String)
    207. Me.Results = results
    208. Me.Status = status
    209. End Sub
    210. <JsonProperty("results")>
    211. Public ReadOnly Results As List(Of Result)
    212. <JsonProperty("status")>
    213. Public ReadOnly Status As String
    214. End Class

    Dateien
    • jsonString.txt

      (242,08 kB, 38 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Morrison“ ()

    Ich verwende gerne eine List (Of T) und gebe diese als Datasource an. Wenn deine Klasse wiederum eine List (Of String) als Property beinhaltet kann man die nehmen um daraus eine Combobox im DataGridView zu füllen (evtl. passiert das sogar automatisch, bin ich mir grad nicht sicher).

    Die Row im DataGridView kann man wiederum zum Objekt T casten um damit dann weiter zu arbeiten (z.b. in einer separaten Form).

    Sofern die Klasse das NotifyPropertyChanged Interface implementiert hat, aktualisieren sich die angezeigten Werte im DataGridView automatisch sobald sich das Objekt ändert.

    Die DataTable versuche ich weitestgehend zu vermeiden, da sie mehr Speicher benötigt und langsamer bei der Verarbeitung ist (wenn ich mich richtig erinnere, meine da mal nen Test gemacht zu haben).
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Morrison
    Deserialisierst du denn wirklich richtig?
    stackoverflow.com/questions/45…agridview-from-json-array

    @mrMo
    DataSet/DataTable ist aus meiner Sicht ein Auslaufmodel. Es mag anfänglich leichter wirken damit umzugehen (Designerunterstützung) aber am Ende des Tages kann ich POCO Klassen dokumentieren wie ich möchte und mir die funktionen schreiben die ich benötige. Paralell.ForEach / PLINQ etc. kitzeln die Leistung aus dem Rechner der zur Verfügung gestellt werden kann, ohne Verrenkungen. Selbst ohne weitere Optimierungen ist der Faktor 4 bis 5 dann schon erreicht, mit dem es schneller rennt als DataTable. Wenn man es denn braucht, ist wirklich eine Frage der Datenmengen.
    Wenn man sich dann noch mit WPF angefreundet hat, ist mit DataSet/DataTable sowieso vorbei.
    @Morrison: Du hast ein tDS und darin DataTables und füllst diese mit JSONs? Oder wie bringst Du typisierte DataTables mit JSON zusammen? tDS ist ja von Haus aus mit XML verbunden, wie Du ja selber weißt.
    Um meinen Curryketchup zum Thema Alternativen auf den Tisch zu hauen: Ich arbeite ähnlich wie Ihr, @mrMo & @Dksksm: Ein einziges Objekt, welches ein oder mehrere List(Of T)-Propertys hat. Dann kann ich das als BindingSource-DataSource nehmen und auch zwischen den Forms rumreichen, um alle Daten zu haben. Die List(Of T)s kann ich an BindingSources (hier könnte ich zwar Werbung für meine tBS machen, aber so dreist bin ich dann doch nicht :whistling: ) binden und erhalte so Designerunterstützung. Und Speichern und Laden: Das "eine, allumfassende Objekt" wird per JSON serialisiert und dann irgendwo gespeichert und später wieder geladen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.