CheckedCombobox füllen mit Datenbank

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

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von fabimaurice.

    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.

    *Topic verschoben*

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

    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
    @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“ ()

    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.
    Du hast ja eine Textbox, in der die PCs stehen. Splitte den Text und füge es der Liste hinzu.

    Das war alles was ich gesucht habe, eine Split Methode mehr brauch ich nicht. Darüber kann ich ja jetzt in meiner List fragen ob sie das Item drin hat und falls, dieses in der Checkedlistbox abhaken. DANKE :D
    Naja entschuldige mich mal bei allen. Ich weiß das ich noch sehr wenig Grundwissen hab bzw. es teilweise vielleicht verstehe aber Fachbegriffe Falsch anwende wie @ErfinderDesRades schon gesagt hat
    hab halt erst vor sehr kurzer Zeit angefangen und hab momentan echt viel zu viel Input so dass ich mir garnicht alles genau merken kann. Versuchen werd ichs trotzdem also hoffe ich mal das ich keine Frage mehr hier stellen muss (auch wenn es unwahrscheinlich ist^^) Falls doch lass ich mich gern nochmals von eurem Wissen beeindrucken.

    Also danke euch MFG

    Fabian
    @fabimaurice
    Ich fühle mit dir. Bin auch ein Anfänger, hatte aber Glück, dass ich dieses Item mal gebraucht habe.

    Versuchen werd ichs trotzdem also hoffe ich mal das ich keine Frage mehr hier stellen muss (auch wenn es unwahrscheinlich ist^^) Falls doch lass ich mich gern nochmals von eurem Wissen beeindrucken.


    Du hast dich einen Tag nach mir regristriert, hast aber auch schon viel weniger Fragen gestellt.

    Mich hat auch schon keiner auf den Kopf gehauen, wenn man zu viel fragt(Solange diese gute Fragen sind und noch nicht beantwortet sind).

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

    @a.b_om
    Wenn ich das jetzt richtig gelesen hab dann kann man glaube ich Split nicht benutzen da meine Textbox ja immer je nach auswahl im Dgv variiert also auch mal nur eine PcID in dieser ist. Kann man das irgendwie flexibler machen damit es in der Hinsicht wie ich es Benutzen möchte funzt?


    Edit:
    Ach ne hab da nach der Falschen Mehtode gesucht mit (Left, Mid, Right) huch^^.
    Geht doch versuche das jetzt umzusetzten falls es klappt gebe ich hier den Code an und sag dir bescheid :)

    Und ich füge noch hinzu das ich auch noch "InotifyPropertyChanged" als Schnittstelle nutze da wie ich denke nur dann die Liste auch bei jeder änderung des Textes der Textbox überhaupt aktuellisiert
    @fabimaurice
    Dann kontrolliere, ob es ein komma in der Texbox hast, wenn ja splitte es wie herkömmlich und sonst, fügst du der Liste den Text(ohne Komma und Space(macht man mit Remove)) in die Liste.

    Das isses.

    Noch eine Frage.

    Weisst du überhaupt, wie man das mit einer Listbox machen könnte? (Ignorier mal die Checkbox Funktionalitäten)


    Edit:

    Bin zu spät (Wie fast immer im Forum). Wenn es funktioniert, ignoriere mein Post.

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

    @a.b_om könnte mir in etwa vorstellen wie es mit einer Listbox allein Funzt. Bin mir jedoch nicht sicher.

    Wenn du möchtest und Zeit hast zeig mir doch anhand eines Beispiels wies geht :)


    (Bin jetzt übrigens soweit das ich nurnoch inotifypropertychanged anbinde damit das hoffentlich klappt^^)

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

    Nochmal so mal sehen ob jemand Plan hat

    Quellcode

    1. Dim myConn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\10.0.0.8\FabianSchmidt$\Documents\Eigenes Programm\DBFS22.accdb;")
    2. Dim myCommand As New OleDbCommand("SELECT Co_PcName From Computer left JOIN UserPc ON UserPc.PcID = Computer.Co_ID WHERE UserPc.UserID = '%" & WAS MUSS HIER REIN DAMIT JE NACH AUSGEWÄHltem User im dgv die richtigen pcs abgehakt werden & "%'", myConn)
    3. Dim myAdapter As New OleDbDataAdapter(myCommand)
    4. Dim myDT As New DataTable
    5. myAdapter.Fill(myDT)
    6. CheckedComboBox1.DataBindings.Add("CheckedItems", myDT, "")


    Im select Statement ist mein Problem ja quasi erklärt xd.
    Habe die CheckedCombobox mit der Liste von Pc's gefüllt. Jetzt sollen die PcS des übers DGV ausgewähltem User in der checkedcombobox, ganz einfach, abgehakt werden. Weiß denn jemand weiter?
    Bilder wie die DatenbankTabellen jetzt aussehen seht ihr unten.


    Computertabelle woher auch die Liste von Pc's in der Checkedcombobox kommt:


    Username tabelle:


    Zwischentabelle: