Vorauswahl in Listbox befüllt mit DataTable

  • VB.NET

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

    Vorauswahl in Listbox befüllt mit DataTable

    Hallo,

    hab mal wieder einen Knoten im Hirn und weiß nicht weiter.
    Folgende Situation:

    Ich habe eine Tabelle mit Schlüsselwörtern und eine Tabelle mit Geräten. Mit einer Zuordnungstabelle ordne ich der "ID" (Primärschlüssel Gerätetabelle) die "ID" (Primärschlüssel Schlüsselwörter) zu.

    In der Form, in der das Gerät angezeigt wird, werden auch die zugeordneten Schlüsselwörter angezeigt. Mittels eines Buttons kann man in eine andere Form (modal) wechseln, in der werden alle verfügbaren Schlüsselwörter in einer Listbox (befüllt mittels DataTable) angezeigt und aus dieser kann man dann die gewünschten Schlüsselwörter auswählen. Mit "OK" wird bestätigt und zur vorigen Form zurückgekehrt. Dann wird die Auswahl aus der modalen Form in die Zuordnungstabelle übernommen.

    Funktioniert alles wunderbar.

    Einen Schönheitsfehler hat es aber. Im modalen Fenster sind alle Einträge der Schlüsselwörter in der Listbox nicht selektiert. Hier möchte ich aber, dass die bisher schon selektierten Einträge aus der Zuordnungstabelle in der Listbox schon vorausgewählt sind, so dass man sich nicht daran erinnern muss, was schon drin ist, sondern einfach das hinzufügt oder entfernt, was fehlt oder nicht mehr passt.

    Soweit verstanden? Es geht mir darum, wie kann ich in der Listbox die Werte vorselektieren, die in der Zuordnungstabelle schon zugeordnet sind. Sowohl in der Listbox, als in der Zuordnungstabelle habe ich die ID des Schlüsselwortes und kann dies also direkt zuordnen.

    Ich hoffe ich konnte das verständlich rüberbringen :)

    EDIT: Ich habe eine Idee, die teste ich mal aus. Ich lade alle dem Gerät zugeordneten Schlüsselwort-IDs in eine Datatable. Dann laufe ich die Listbox-Items von oben nach unten durch, lese die ID des Schlüsselworts aus. Dann mache ich damit einen Select auf die Datatable, gibt es einen Treffer, setze ich mit setselected die Selektion.

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me

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

    @Lord Luxor Dann probier mal, Deine Auswahl den ListBox.SelectedItems zuzuweisen.
    docs.microsoft.com/de-de/dotne…selecteditem?view=net-5.0
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi Rod,

    Danke, hab zwar ne Nacht drüber schlafen müssen, war gestern so lange geistig im Kreis gelaufen, da lief nix mehr :)

    VB.NET-Quellcode

    1. Private Sub Select_Information_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim data_select As String
    3. Dim inf_id As String
    4. If OpenDB() Then
    5. sqlCmd.Connection = Conn
    6. sqlCmd.CommandText = "SELECT id, bezeichnung FROM fisms_informationscluster ORDER BY bezeichnung"
    7. DtA.SelectCommand = sqlCmd
    8. Dim infDt = New DataTable()
    9. DtA.Fill(infDt)
    10. ListBox1.DataSource = infDt
    11. ListBox1.DisplayMember = "bezeichnung"
    12. ListBox1.ValueMember = "id"
    13. ListBox1.Refresh()
    14. sqlCmd.CommandText = "SELECT * FROM fisms_proz_inf WHERE proz_id = " & CStr(auswahlid)
    15. DtA.SelectCommand = sqlCmd
    16. DtA.Fill(sqlDt2)
    17. For i = 0 To ListBox1.Items.Count - 1
    18. Dim lobj As DataRowView = CType(ListBox1.Items.Item(i), DataRowView)
    19. inf_id = Cstr(lobj("id"))
    20. data_select = "inf_id = " & inf_id
    21. Dim type_row As DataRow = sqlDt2.Select(data_select).FirstOrDefault()
    22. If type_row IsNot Nothing Then
    23. ListBox1.SetSelected(i, True)
    24. End If
    25. Next
    26. ListBox1.Refresh()
    27. Conn.Close()
    28. Conn.Dispose()
    29. Else
    30. MessageBox.Show("Kann Informationsdatensatz nicht lesen", "F-ISMS Fehlermeldung", MessageBoxButtons.OK, MessageBoxIcon.Error)
    31. End If
    32. End Sub


    Hab es jetzt so gelöst, lade aus der Zuordnungstabelle in eine Datatable (sqlDt2). Dann laufe ich die Listbox1 runter, hole mir aus dem DataRowView die entsprechende ID, mache auf die Datatable sqlDt2 einen Select, findet er was setze ich listbox1.selselected(index, true).



    Funktioniert.

    Eine kleine Sache noch, hat jetzt eigentlich nix mehr mit DB zu tun. Bei den Listboxen ist immer der erste Eintrag selektiert. Das führt zu unschönen Effekten:



    Ich habe noch keine Einstellung gefunden, mit der man einer Listbox das austreibt, dass der erste Eintrag selektiert ist. Alternativ könnte ich natürlich setselected(0,false) machen, bevor ich die Zuordnungstabelle einlese. Aber vielleicht gibt es doch irgendeine Eigenschaft der Listbox, die die Selektion des ersten Eintrags ausschaltet.

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me

    Lord Luxor schrieb:

    Bei den Listboxen ist immer der erste Eintrag selektiert.
    Den kannst Du doch mit

    VB.NET-Quellcode

    1. ListBox1.SetSelected(0, False)
    wieder de-selektieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja das hatte ich ja erwähnt, dass ich das machen könnte.
    Ich wollte nur wissen, ob es eine Voreinstellung gibt, die das Verhalten an sich unterdrückt, als ständig eine Zeile Code reinschreiben zu müssen.

    Aber ist wohl so.

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me

    Lord Luxor schrieb:

    ob es eine Voreinstellung gibt, die das Verhalten an sich unterdrückt


    Warum sollte man das unterdrücken wollen?
    Es ist doch ziemlich nützlich, dass - wenn Daten da sind - dass dann immer ein Element selectiert ist.
    Mitunter ists ziemlich schwierig, eine konsistente Oberfläche zu implementieren, die 'Nicht-Selectiert' auch korrekt darstellt.
    Da müssen ja Buttons disabled werden und Kram.

    Und wie soll ein User, der 'Nicht-Selectiert' haben möchte, diesen Zustand wieder herstellen, wenn er aus versehen in die Listbox geklickt hat?

    Also der Übergang 'Nicht-Selectiert' - 'Selectiert' darf dann ja nicht unumkehrbar sein, oder?

    Viel MÜhe kann gespart werden, wenn mans lässt wies ist: Wenn Daten da sind, ist automatisch auch ein Element selektiert.
    Auch ein Argument. Für mein Projekt passt es halt nicht bei jeder Listbox, weil es eher zu Bedienungsfehlern führen könnte.
    Nun gut, dann werfe ich die Selektion programmtechnisch raus.

    Danke.

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me