ListView inhalt aktualisieren

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von stefan0801.

    ListView inhalt aktualisieren

    Hallo ich bin dabei eine Funkspiel Leitstelle zu erstellen und habe eine listview für Statuse die sich mit einem Timer aktualisiert aber dann kann ich die Einträge nicht mehr auswählen für eine contextmenustrip
    kann mann das so machen das es funktioniert ?
    Vielen Dank im vorraus

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

    Wann kannst du die Status nicht wählen? Während der aktualisierung?
    "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
    Gib mal bitte ein paar Daten: Wie oft aktualisiert denn der Timer die Status? Ja, der Plural von Status ist Status, nur eben mit langem U; daher wohl eindeutiger: Wie oft aktualisiert denn der Timer die Statusanganben? Warum ein ListView? Wer heutzutage mit ListView arbeitet, ist im falschen Jahrzehnt stehengeblieben, hat einen verdammt guten Grund oder weiß sich nicht anders zu helfen. Und: Ist es richtig, dass Du das Kontextmenü (CM) zwar aufrufen kannst, aber wenn der Timer tickt, es wieder verschwindet, da Du den kompletten ListView-Inhalt neu erstellst? Wäre es dann eine Option, den Timer auszusetzen, wenn das CM angezeigt wird?
    Und bitte: Nutze (eine sinnvolle) Interpunktion. Sätze ohne Punkt und Komma sind sehr schwierig zu verstehen.
    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.
    Wie und in welchem Intervall lädst du die Daten in dein ListView? Woher kommen die Daten für den Status, dass du die regelmäßig aktualisieren musst?
    "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
    Vielen Dank für's Ignorieren, da ich jene Frage (und noch einige andere) bereits in Post#3 gestellt habe X(

    VaporiZed schrieb:

    Ist es richtig, dass Du das Kontextmenü (CM) zwar aufrufen kannst, aber wenn der Timer tickt, es wieder verschwindet, da Du den kompletten ListView-Inhalt neu erstellst? Wäre es dann eine Option, den Timer auszusetzen, wenn das CM angezeigt wird?

    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.
    *unnötiges Zitat entfernt*

    Endschuldigung
    nein ich möchte in der listview ein Eintrag auswählen und dann cm aufrufen und abfragen welchen eintrag ausgewählt wurde aber dieses geht nicht weil der Timer das immer neu lädt
    mit dem ausätzen geht das daher auch nicht

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    1. Nochemol: Ist es richtig, dass, wenn der Timer tickt, der komplette ListView-Inhalt neu erstellt wird? Wenn ja, warum nicht einfach die vorhandenen Daten durchgehen und nur Änderungen aktualisieren? Wie sieht denn Dein Timer-Tick-Code bzgl. des ListViews aus?
    2. Ist das wirklich notwendig, dass alle 100ms die Statusangaben neu erfasst werden?
    3. Was beinhaltet das CM? Wenn es nur darum geht zu erfahren, welches Item angeklickt wird, geht das doch auch über ListView-SelectedItemChanged?
    4. Nochemol: Warum ListView? Hast Du da mal n Screenshot Deines GUIs (Deines laufenden Programms)? Wenn ja, bitte über [Erweiterte Antwort] hochladen, nicht über externe Bildhoster.
    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.

    VB.NET-Quellcode

    1. ​Imports MySql.Data.MySqlClient
    2. Public Class Statusübersicht
    3. Dim con As New MySqlConnection("datasource=*********;port=3306;username=*******;password=*******;database=*******")
    4. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    5. Try
    6. Dim cmd As New MySqlCommand("SELECT * FROM `BF_Essen_FuRW_1_(FW)_Status`", con)
    7. Dim reader As MySqlDataReader
    8. ListView1.Items.Clear()
    9. Dim i As Integer = 0
    10. con.Open()
    11. reader = cmd.ExecuteReader
    12. While reader.Read
    13. ListView1.Items.Add(reader("Status"))
    14. ListView1.Items.Item(i).SubItems.Add(reader("Lst_Status"))
    15. ListView1.Items.Item(i).SubItems.Add(reader("Funkrufname"))
    16. ListView1.Items.Item(i).SubItems.Add(reader("Besetzer"))
    17. i += 1
    18. End While
    19. reader.Close()
    20. con.Close()
    21. Catch ex As Exception
    22. MsgBox("Fehler !")
    23. End Try
    24. End Sub
    25. Private Sub Statusübersicht_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    26. Timer1.Start()
    27. LST_S_BF1()
    28. End Sub
    29. Private Sub LST_S_BF1()
    30. Try
    31. Dim cmd As New MySqlCommand("SELECT * FROM `BF_Essen_FuRW_1_(FW)_Status`", con)
    32. Dim reader As MySqlDataReader
    33. con.Open()
    34. reader = cmd.ExecuteReader
    35. While reader.Read
    36. ComboBox1.Items.Add(reader("Funkrufname"))
    37. End While
    38. reader.Close()
    39. con.Close()
    40. Catch ex As Exception
    41. MsgBox("Fehler>!<<")
    42. End Try
    43. End Sub
    44. Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
    45. If Not ComboBox1.SelectedItem = "" Then
    46. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='A' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    47. Try
    48. con.Open()
    49. cmd.ExecuteNonQuery()
    50. con.Close()
    51. Catch ex As Exception
    52. End Try
    53. Else
    54. MsgBox("KeinFahrzeug Ausgewält")
    55. End If
    56. End Sub
    57. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    58. If Not ComboBox1.SelectedItem = "" Then
    59. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='E' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    60. Try
    61. con.Open()
    62. cmd.ExecuteNonQuery()
    63. con.Close()
    64. Catch ex As Exception
    65. End Try
    66. Else
    67. MsgBox("KeinFahrzeug Ausgewält")
    68. End If
    69. End Sub
    70. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    71. If Not ComboBox1.SelectedItem = "" Then
    72. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='C' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    73. Try
    74. con.Open()
    75. cmd.ExecuteNonQuery()
    76. con.Close()
    77. Catch ex As Exception
    78. End Try
    79. Else
    80. MsgBox("KeinFahrzeug Ausgewält")
    81. End If
    82. End Sub
    83. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    84. If Not ComboBox1.SelectedItem = "" Then
    85. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='F' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    86. Try
    87. con.Open()
    88. cmd.ExecuteNonQuery()
    89. con.Close()
    90. Catch ex As Exception
    91. End Try
    92. Else
    93. MsgBox("KeinFahrzeug Ausgewält")
    94. End If
    95. End Sub
    96. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    97. If Not ComboBox1.SelectedItem = "" Then
    98. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='H' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    99. Try
    100. con.Open()
    101. cmd.ExecuteNonQuery()
    102. con.Close()
    103. Catch ex As Exception
    104. End Try
    105. Else
    106. MsgBox("KeinFahrzeug Ausgewält")
    107. End If
    108. End Sub
    109. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    110. If Not ComboBox1.SelectedItem = "" Then
    111. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='J' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    112. Try
    113. con.Open()
    114. cmd.ExecuteNonQuery()
    115. con.Close()
    116. Catch ex As Exception
    117. End Try
    118. Else
    119. MsgBox("KeinFahrzeug Ausgewält")
    120. End If
    121. End Sub
    122. Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
    123. If Not ComboBox1.SelectedItem = "" Then
    124. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='L' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    125. Try
    126. con.Open()
    127. cmd.ExecuteNonQuery()
    128. con.Close()
    129. Catch ex As Exception
    130. End Try
    131. Else
    132. MsgBox("KeinFahrzeug Ausgewält")
    133. End If
    134. End Sub
    135. Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
    136. If Not ComboBox1.SelectedItem = "" Then
    137. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='U' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    138. Try
    139. con.Open()
    140. cmd.ExecuteNonQuery()
    141. con.Close()
    142. Catch ex As Exception
    143. End Try
    144. Else
    145. MsgBox("KeinFahrzeug Ausgewält")
    146. End If
    147. End Sub
    148. Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
    149. If Not ComboBox1.SelectedItem = "" Then
    150. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='c' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    151. Try
    152. con.Open()
    153. cmd.ExecuteNonQuery()
    154. con.Close()
    155. Catch ex As Exception
    156. End Try
    157. Else
    158. MsgBox("KeinFahrzeug Ausgewält")
    159. End If
    160. End Sub
    161. Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
    162. If Not ComboBox1.SelectedItem = "" Then
    163. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='o' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    164. Try
    165. con.Open()
    166. cmd.ExecuteNonQuery()
    167. con.Close()
    168. Catch ex As Exception
    169. End Try
    170. Else
    171. MsgBox("KeinFahrzeug Ausgewält")
    172. End If
    173. End Sub
    174. Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
    175. If Not ComboBox1.SelectedItem = "" Then
    176. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='u' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    177. Try
    178. con.Open()
    179. cmd.ExecuteNonQuery()
    180. con.Close()
    181. Catch ex As Exception
    182. End Try
    183. Else
    184. MsgBox("KeinFahrzeug Ausgewält")
    185. End If
    186. End Sub
    187. Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.Click
    188. If Not ComboBox1.SelectedItem = "" Then
    189. Dim cmd As New MySqlCommand("UPDATE `BF_Essen_FuRW_1_(FW)_Status` SET `Lst_Status`='' WHERE `Funkrufname`= '" & ComboBox1.SelectedItem & "'", con)
    190. Try
    191. con.Open()
    192. cmd.ExecuteNonQuery()
    193. con.Close()
    194. Catch ex As Exception
    195. End Try
    196. Else
    197. MsgBox("KeinFahrzeug Ausgewält")
    198. End If
    199. End Sub
    200. End Class

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

    Die Zeilen#9-#21 sind doch eindeutig. Anstatt dauernd das ListView zu leeren und neu zu befüllen - was genau zu Deinem CM-Problem führt - einfach die Werte aktualisieren, die nicht mehr stimmen.
    Deine CEs sind seeehr aussagekräftig benannt. Button1, Button2, Timer1, ... Man sollte sich anfangs die 5 Sekunden nehmen, um ein CE entsprechend seiner Aufgabe zu benennen.
    Anstatt bei den ganzen Buttons den fast gleichen Funktionstext zu schreiben, lager die DB-Aufrufe aus und besetze die passenden Stellen mit Variablen. Der Teil scheint immer gleich zu sein:

    VB.NET-Quellcode

    1. If Not ComboBox1.SelectedItem = "" Then
    2. Dim cmd As New MySqlCommand(hier einzig variabler Text)
    3. Try
    4. con.Open()
    5. cmd.ExecuteNonQuery()
    6. con.Close()
    7. Catch ex As Exception
    8. End Try
    9. Else
    10. MsgBox("KeinFahrzeug Ausgewält")
    11. End If

    Was soll die Zeile mit Catch Ex As Exception? Was für eine Art von Ausnahme kommt denn, wenn Du den Try-Block weglässt? Durch solche Konstrukte entstehen früher oder später Probleme, die man nicht mehr blickt, siehe Avoid Try-Catch
    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.
    Öhm. Dann stellt sich die Frage, wie weit Dein Programmierwissen ist. Und woher Du den bisherigen Code hast. Bitte beantworte diese Fragen, damit uns klar ist, an welcher Haltestelle wir Dich abholen können, nicht dass wir mit Konzepten kommen, die noch etwas zu tief gehen.
    Du hast:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. ListView1.Items.Clear()
    3. '[...]
    4. ListView1.Items.Add(reader("Status"))
    5. ListView1.Items.Item(i).SubItems.Add(reader("Lst_Status"))
    6. ListView1.Items.Item(i).SubItems.Add(reader("Funkrufname"))
    7. ListView1.Items.Item(i).SubItems.Add(reader("Besetzer"))

    Zeile#2 löscht Dir Deinen ListView-Inhalt. die folgenden Zeilen schreibt Dir neue Zeilen ins ListView. Ich hoffe, dass Dir das bereits bewusst war.
    Das muss also anders geschrieben werden.
    Dazu 1.:
    Kürzer schreibt man nen ListView-AddItem-Eintrag so:

    VB.NET-Quellcode

    1. ListView1.Items.Add(New ListViewItem({reader("Status"), reader("Lst_Status"), reader("Funkrufname"), reader("Besetzer")}))

    Das Aktualisieren würde ich so machen, vorausgesetzt, der Besetzer ist quasi eine Konstante in der Auflistung. Ist dem so, dass der Besetzer sich am seltensten von den Daten ändert?

    VB.NET-Quellcode

    1. Dim CurrentUser As String = Nothing
    2. While reader.Read
    3. CurrentUser = reader("Besetzer")
    4. For i = 0 To ListView1.Items.Count - 1
    5. If ListView1.Items(i).SubItems(3).Text = CurrentUser Then
    6. ListView1.Items(i).SubItems(0).Text = reader("Status")
    7. ListView1.Items(i).SubItems(1).Text = reader("Lst_Status")
    8. ListView1.Items(i).SubItems(2).Text = reader("Funkrufname")
    9. Continue While
    10. End If
    11. Next
    12. ListView1.Items.Add(New ListViewItem({reader("Status"), reader("Lst_Status"), reader("Funkrufname"), CurrentUser}))
    13. End While

    An alle CCD-Leute: Mir ist klar, dass man den For-Schleifen-Inhalt besser in ne Extra-Sub auslagern sollte. Und ggf. Ist es auch besser, jeden SubItem-Inhalt auf Update-Notwendigkeit zu prüfen, bevor man ihn überschreibt. Aber erstmal vom Prinzip her.

    Aber ich leiste schon wieder Schützenhilfe bei der Verwendung von ListViews. Die sind sooo veraltet. Nimm nen DGV.
    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.