CheckedCombobox füllen mit Datenbank

  • VB.NET
  • .NET 4.5

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

    CheckedCombobox füllen mit Datenbank

    Hi, (Erstmal alles auf Anfang.)

    Also ich habe 2 Spalten "User"(Aus der Tabelle Username) und die andere nennt sich "PcID"(Also PC01,PC02 etc.)(Aus der Tabele Pc's), In der Datenbank kann Eine "PcID" mehrere "User" haben und genauso andersrum
    also eine Many to Many Relation diese haben noch eine Zwischentabelle namens "UserPcIDs" in der die PcIDs und User die diese benutzen dargestellt sind(Bilder seht ihr unten)

    Ich möchte in meine implementierte CheckedCombobox (Bild und Link zur CheckedCombobox angehängt) meine Datenbank so anbinden das die PcIDs oben im Textfeld der Box angezeigt werden(Also z.b Pc01; Pc04; Pc05 Mit allen Pcs die halt bei diesem User ausgewählt sind) die dem Benutzer zugeteilt sind und unten im Dropdown Alle Pcs sind und jeder der dem User zugeteilt ist abgehakt wird. Außerdem sollen die Pcs in dem Dropdown nicht mehrmals erscheinen



    Zwischentabelle:

    Username Tabelle:

    CheckedCombobox:


    Sry für die vielen Themen dazu sind nur leider ein paar Sachen anders geworden und nun möchte ich das ganze nochmal in einem Thema vereinen um evtl das zu finden was ich brauche.
    Also wär es geil wenn ich das endlich gelöst bekomme :D Danke schonmal.

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

    Hi. @fabimaurice

    Ich sehe da zwei Möglichkeiten für dich, die schnelle einfache und die "abstrahierende".

    Schnell und einfach, den ersten Treffer der den Wert der "Checkbox" mittels schleife ermitteln und wenn "checked" dann schleifen Abbruch pro PCId.

    Ahh... Ich habe nochmal über dem Kaffeesatz gebrütet, dann über deiner Frage gebrütet und jetzt sind hier überall Küken... :/

    Jetzt habe ich es, Du brauchst einen "Filter".

    Der erste Satz ist immer anzuwenden, wenn die Software verkauft wird, aber unbedingt zu vermeiden bei Vorstellungsgesprächen bei Goolge und Co. :/

    Nochmal zum Problem.

    Also ist die Anbindung an die Datenbank eine Abfrage mit den von Dir genannten Kriterien.

    Bei jedem eintippen eines Suchzeichens in die ComboBox-Textzeile eine neue Anfrage mit dem Filtertext/Suchtext, und die Antwort(en) in die ComboBox-Liste mit der PCID befüllen.

    Da ich aber seit 2008 keine Datenbanken mehr anspreche, kann ich Dir mit den Datasets/Abfragen nicht so richtig helfen.

    Wenn du aber mit LINQ und WPF arbeitest, kann das sehr schnell Abgefragt werden und lokal im Rechner gefiltert, und dann mit Schleifchen und Tütü aufgehübscht werden.

    Nochmal technischer:

    Abfrage aller Daten bei "Fokus" der Combobox. (nur einmal, aber effizienter als bei jedem Zeichen)
    Dann diese in eine "abstrahierte" Datenmenge überführen. (Eigene Klasse mit nur den notwendigen Eigenschaften, die angezeigt/verarbetet werden sollen)
    Die gesamte Datenmenge mit schleifen Filtern, um sie dann in die Combobox "gefiltert" einfügen.

    Ich habe mal was mit LINQ-to-SQL gehört, aber selbst noch nie gebraucht...

    Auf der WPF-Seite kann das Filtern und Suchen auf der ComboBox-Ebene erledigt werden, mittels "Binding" und "CollectionViewSource".
    Die Filterung mittels CollectionViewSource, kann auch Gruppieren, und pro Gruppe eigene "Aufhübschung" haben, was beim Anzeigen deiner User per PCID, perfekt
    passen würde.

    Angehängt ein Bild mit der CollectionViewSource-Technik in WPF.
    Es zeigt eine Verwaltung von WIKIMedia Artikeln an, und ist nicht an eine Datenbank direkt angebunden, aber an eine REST-API.
    Oben-links ist ein Button der sich auf den Zustand der ToggleButtons innerhalb der "ListBoxItems" bezieht, und diese entsprechend "ausblendet".
    Die ToggleButtons sind nur für den User/UI gedacht und sind durch das "abstrahieren" zusätzlich filterbar, was nichts mit den Datensätzen zu tun hat, sondern nur "Aufhübschung" ist. (eigentlich Usability, aber das ist Web 2.0, und sowas von Oldscool...) ;)



    Sollte WinForms das gift deiner Wahl sein, dann hilft nur "Ownerdrawn" (selbstgezeichnet).
    Da kann ich dir nicht mehr helfen, ist schon über 10 Jahre her, das ich das gemacht habe.

    Wenn fragen zum WPF ansatz, dann kann ich auch mal ein Video online stellen mit dem Programm im Bildbeispiel, falls gewünscht.

    c.u. Joshi aus HH, wo wiedermal Regen...
    @fabimaurice Du könntest in einer For-Schleife oder For Each-Schleife das erste Element nehmen und schaust, ob irgendein anderes Element mit einer anderen Id, dem gleichen Wert hat und dann dieses Element aus der CheckedBox löschen. Danach kontrollierst du das zweite Elemant nach doppelten Elementen und löschst diese und danach gehst du weiter. Es geht so lange, bis du alle Elemente der CheckedBox überprüft hast. So bekommst du wenigstens die doppelten Einträge weg. Danach, kannst du die Elemente mit der 2. Liste auf ähnlicher Weise kontrollieren.

    So würdest du ein Element mit dem Haken füllen(i ist der Index):

    Quellcode

    1. ​checkedListBox1.SetItemChecked(i, true);
    Hi!

    Ich würde von dieser Spezial-CheckedListbox erstmal abraten.
    Für eine Datenverarbeitung mit deiner Komplexität solltest du dich v.a. erstmal mit dem Standard-Instrumentarium vertraut machen.
    Das sieht dann vlt. anders aus, als du dir das zusammengedacht hast, aber funzen tuts evtl. besser - v.a. kann man dir dabei helfen.
    Mit deiner Spezial-CheckedListbox umzugehen kann dir vmtl. keiner helfen. Ich vermute auch, die unterstützt Databinding nicht in dem Masse, die die Standard-Controls, die ich dir empfehle.

    Wie anderswo glaub schon gesagt: Einen m:n-View erstellt man mit Standard-Controls ohne eine einzige Zeile Code.
    Wenn du dich da jetzt mit deiner CheckedCombo abkämpfst, wirst du vmtl. nie erfahren, wie einfach es eiglich ist, wenn man einfach die vorgesehene Standard-Technologie für sich arbeiten lässt.
    Hübsch machen (und umständlicher) kann man später immer noch.

    Also gugge m:n-View auf vier Views-Videos
    Wenn du den auf deine Verhältnisse angepasst hast, dann hast du schon eine ziemliche Menge Basics gelernt.
    Und dann kannste immer noch überlegen, obs nu unbedingt doch die Spezial-CheckedCombo sein muss.
    Vermutlich kriegstes dann sogar besser gebacken, die anzuwenden, mit dem dann gewonnenen Verständnis von BindingSources etc.
    Hi.

    Ich habe den anderen Beitrag von @fabimaurice gesehen, wo diese "CheckedComboBox" in WinForms mit einem BeispielCode von MS in Visual Studio 2015 vorliegt.

    Das Hauptthema des Exkurses ist:
    "DrawMode = Windows.Forms.DrawMode.OwnerDrawVariable" und die Implikative nichtdeterministische Meta-Objektive Miezekatze des alten Schrödinger.
    (Die, die müffelt und nicht die Katze in der Kiste. 8| :/ ?( )

    Also, ist auch von mir der Vorschlag, sich mit grundlegenden Elementen der UI zu behelfen.
    Am besten gleich auf WPF umsteigen und den Kurs von @Nofear23m zu belegen.
    Ich kann dir auch einen Kursus zusammenstellen und die Sekunde berechne ich nur 20-Millionen Lire... lol

    Nee... das hat der NoFear schon gemacht...

    Steige schnell um und vergiss mal WinForms, es sei denn es ist ein Anforderung.

    Tutorialreihe <WPF lernen/>

    Es dauert etwas, aber nicht wirklich lange und es gibt eine menge an Videos im roten Video Portal mit dem Dreieck.

    @a.b_om Sicher können wir helfen, und selbst mit dem Quellcode scheint das vorhaben dann eher in Richtung Usability und UI-Design zu gehen, als die Datenverarbeitung.
    Ich habe den anderen Beitrag überflogen, und kann mich Dem Rademacher, ahh nee... Erfinder :whistling: nur anschliessen und gehe sogar etwas weiter und empfehle hier WPF.

    Aber vielleicht ist dem einen oder anderen aufgefallen, das ich die ComboBox als Ansammlung der Benutzernamen benutze und bei Auswahl eines Benutzers die "resultierenden" Bilder aufliste. (siehe weiter oben das angehängte Bild)

    Es ist effektiver eine ComboBox und eine ListBox zu nutzen, und die Anzeige der Daten "vor" der Bereitstellung in der Benutzeroberfläche zu "verarbeiten".

    Und innerhalb der Listbox könnte die CheckBox auch mittels Auswahl (selection) der Elemente erfolgen.

    In Zeiten von FullHD und bald 4K Auflösungen, ist eine ComboBox mit "Spezialinhalt" nicht mehr notwendig.
    Die andere Niesche ist Mobil und dort wird das wohl möglich sein, aber nicht mit WinForms.

    So, hab meinen Senf dazugegeben, und bin raus... Mikrophon fallen lass...

    c.u Joshi
    @Joshi
    Klar, ist WPF besser, aber wenn er das so machen möchte, darf er das auch. Die Art, wie er das machen müsste ähnelt der Combobox Art. Nur das mit den Checkboxen ist anders. Wie er einer von denen Auswählen kann, habe ich schon gesagt(Post 3). Er müsste nur noch die doppelten Einträge löschen, dann hätte er das. Es ist eigentlich ganz einfach, wenn man es versteht. Setze es mit einer normalen Combobox gleich, mit einem Feature. Die doppelten Einträge zu löschen, ist bei beiden gleich. Nur die Checkboxen erschweren das eigentlich.
    @fabimaurice

    Hat sich das Thema erledigt? Wenn ja, was ist die Lösung? Brauchst du immer noch Hilfe dabei?
    Ja brauche noch Hilfe dabei. Die Doppelten Einträge habe ich mittels Select Statement gelöst

    Quellcode

    1. "SELECT PcID From UserPc INNER JOIN Username ON Username.U_User = UserPc.User Group by PcID"
    Das Group by filtert dann auch wie gewollt doppelte Einträge raus. Das ganze ist jedoch nichtmehr das vorgefertigte Steuerelement weil wie ihr schon meintet wirk wie ziemlich großer Dullmist^^, das ganze
    besteht jetzt aus einer Textbox und einer Checkedlistbox.

    In der Checkedlistbox sind alle Pcs aufgelistet. Und die Textbox ist an die Spalte im DGV gebunden.
    Also wäre mein einziges Problem was jetzt noch besteht einfach nur das wenn in der Textbox z.b Pc05, Pc07 steht. In der Checkedlistbox diese Pcs abgehakt werden.



    Btw sorry für die späte Antwort aber ich war im Urlaub :D. Und ich muss das ganze ohne WPF machen würde mir aber gerne das mal anschauen nachdem ich hiermit fertig bin weil das ganze wesentlich angenehmer klingt als jetziges:D

    Neu

    @fabimaurice
    Schau Post 3 an. Dort siehst du, wie man einen der Elemente auswählen kann.

    Die Lösung:

    Quellcode

    1. Dim list As New List(Of String)
    2. list.Add(Erster PC, in der Textbox)
    3. list.Add(Zweiter PC, in der Textbox)
    4. ...
    5. Dim i As Integer = 0
    6. For Each element As String In checkedListBox.SelectedItem
    7. If element = list.Item(i)
    8. checkedListBox.SetItemChecked(i, true);
    9. End If
    10. i = i + 1
    11. Next element


    So würde ich das lösen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „a.b_om“ ()

    Neu

    fabimaurice schrieb:

    In der Checkedlistbox sind alle Pcs aufgelistet. Und die Textbox ist an die Spalte im DGV gebunden.
    Das kann nicht stimmen.
    Databinding unterstützt so etwas nicht (dass mehrere Werte in eine Textbox gedrückt werden).

    Kann sein, dass du die Textbox mit Werten füllst - aber das ist kein Binding.

    Dringende Empfehlung: Verwende Begriffe (wie Databinding) richtig oder besser nicht.
    Irgendwann willst du vlt. wirklich mal mit Databinding arbeiten, und dann stehst du dir selbst sowas von im Weg, weil du dir ein falsches Verständnis von Databinding angewöhnt hast.