Alle ComboBoxen mit gleicher DataSource reagieren synchron

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

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

    Alle ComboBoxen mit gleicher DataSource reagieren synchron

    Hallo zusammen,

    leider ist mir kein besser passender Titel zu meinem Problem eingefallen.

    ​Ich habe ein kleines Programm, mit dem ich Benutzern die Möglichkeit gebe diverse Dinge zu tun.
    ​Beim Start des Programms muss der Benutzer sich anmelden. Seinem Anmelde-Account sind diverse
    ​Berechtigungen hinterlegt, die regeln was der Benutzer darf oder was eben nicht.

    Nun habe ich mir ein Berechtigungsformular erstellt, in welchem ich einstellen welche Berechtigungs-
    ​stufe für die jeweilige Aktion notwendig sind. (Über ComboBoxen)
    ​Zum Beispiel welchen Berechtigungslevel ein Benutzer haben muss, um einen anderen Benutzer anlegen
    zu dürfen.

    ​Die Berechtigungsgruppen die zur Auswahl stehen sind in einer DataTable in einem DataSet enthalten.
    ​Diese DataTable mit den verschiedenen Berechtigungsstufen nutze ich als DataSource für meine Comboboxen.
    ​Als ValueMember ist die Berechtigungsstufe als Integer hinterlegt und als DisplayMember der jeweilige Name
    der Stufe als String.
    Diese DataSource habe ich jeder ComboBox hinzugefügt, sodass ich das Ergebnis bekomme wie im Bild zu sehen.

    Bild

    ​Problem ist, dass wenn ich eine ComboBox ändere, sich alle ComboBoxen mit der selben DataSource automatisch
    ​mit ändern. Dies ist natürlich nicht gewollt.

    Wie verhindere ich dies?
    ​Oder muss ich für jede ComboBox eine BindingSource erstellen? Dann hätte ich ja bei 50 ComboBoxen auch 50
    BindingSources... Ist das so wirklich richtig?

    Ruzbacky schrieb:

    Dies ist natürlich nicht gewollt.
    Jou.
    Clone die DataSource, bwevor Du sie hinzufügst.
    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!
    Nutze bitte die Funktion des Dateiuploads des Forums. Ich kann über diese werbeverseuchten Hoster leider kaum was vom Screenshot erkennen.

    Das Klonen der DataSource wurde dir ja schon geschrieben.

    Ich würd die Rechteverwaltung umdrehen. Hinterlege einer Rolle Rechte, nicht umgekehrt. Damit ist man flexibler.
    Bilder
    • wp_ss_20161231_0001.png

      1,24 MB, 2.560×1.440, 282 mal angesehen
    "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
    Das heißt ich benötige für jede ComboBox eine eigene DataSource, sodass sich im Designer folgendes IMHO unschöne Bild ergibt.

    Bild

    Und wenn ich die DataSource im Code an die ComboBox binden möchte, dann muss jede ComboBox einzeln an eine neue Kopie
    der DataSource gebunden werden...

    ​Hmm hatte gedacht das geht einfacher und eleganter.

    ​Und eine ​Clone Methode, so wie es sie für ein Array gibt habe ich für die DataSource noch nicht gefunden oder?

    ​Ich danke dir aber schonmal für deine Hilfe.

    Ruzbacky schrieb:

    unschöne Bild ergibt
    Nö.
    Z.B. so was:

    VB.NET-Quellcode

    1. Dim array() = {"a", "b", "c", "d"}
    2. Me.ComboBox1.DataSource = array.Clone()
    3. Me.ComboBox2.DataSource = array.Clone()
    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!
    scheinbar ist der TE nicht wirklich an Lösungen interessiert, oder es reicht ihm, wenn nur wenige seine Bilder angucken, nämlich die, die bereit sind, Schmuddel-Hoster zu besuchen.
    Also falls du interessiert bist, das Spektrum der Antworter zu erweitern:
    Nutze die Upload-Funktion (wurde ja schon gesagt).
    Hier auch eine Anleitung dazu:

    Und generell kann man sagen, dazu kann man garnix sagen, ohne das dahinter-stehende Datenmodell zu kennen.
    Synchrones Verhalten von Comboboxen ist mir bekannt, und deutet in diesem Fall auf a) falsch eingerichtetes Databinding, b) falsch konzipiertes Datenmodell hin.

    Zu den 50 Comboboxen: Das wäre natürlich der nächste Design-Fehler, wenn man tatsächlich so viele Combos unterbringt.
    Vermutlich sinnvoller wäre, ein Datagridview zu verwenden, und darin ComboboxDataColumns einzurichten.
    Aber das sind alles nur Tips ins Blaue hinein (Ausser der, wie man ein Bild richtig uploaded) - wie gesagt: Ohne Kenntnis des Datenmodells...
    Sorry, dass ich mich erst so spät wieder melde. War Beruflich die letzten zwei Wochen stark eingespannt und deswegen nur wenig zuhause.

    ErfinderDesRades schrieb:

    scheinbar ist der TE nicht wirklich an Lösungen interessiert, oder es reicht ihm, wenn nur wenige seine Bilder angucken, nämlich die, die bereit sind, Schmuddel-Hoster zu besuchen

    ​Ich entschuldige mich für diese Unannehmlichkeiten. Leider habe ich mich von dem Button "Bild" blenden lassen und diesen genutzt.
    ​Es war keineswegs meine Absicht die zarten Augen der Hilfsbereiten Community mit solchem Schmuddel zu quälen.
    ​Ich hoffe man hat ein Nachsehen und verzeiht mir diesen Fauxpas ;(

    ​Nach wie vor bin ich natürlich an Hilfreichen Antworten interessiert.
    ​Und bitte habt Verständnis, dass das Programmieren bei mir nur als Hobby zu werten und es nicht immer leicht ist für mich, sich
    ​auf diesem Gebiet weiterzubilden, da die Zeit hierfür leider sehr begrenzt ist.
    Dennoch versuche ich im Rahmen meiner Möglichkeiten natürlich möglichst brauchbaren Code zu erzeugen.

    mrMo schrieb:

    Ich würd die Rechteverwaltung umdrehen. Hinterlege einer Rolle Rechte, nicht umgekehrt. Damit ist man flexibler.

    ​Es ist nicht so, dass ich diesen Prozess der Rechtevergabe für jeden Nutzer wieder und wieder machen muss.
    ​Ich habe in meinem Programm drei Teilbereiche, die da wären:
    -Verwaltung
    -Maschinenmanager
    -Schweißtechnik
    Für diese Teilbereiche gibt es verschiedene Berechtigungsstufen, z.B.:
    -Gast
    -Leser
    -Bearbeiter
    -Admin

    ​In meinem Fall möchte ich Zentral einstellen, was der jeweiligen Berechtigungsstufe gestattet ist.
    ​Zum Beispiel darf ein "Bearbeiter" im Bereich Maschinenmanager eine Maschine löschen oder eine
    neue Maschine anlegen???

    ​Mit den ComboBoxen greife ich nicht aktiv in das Datenmodell ein, also ich ändere damit keine Daten.
    ​Ich möchte lediglich die möglichen Berechtigungsstufen aus dem Datenmodell abgreifen.

    ​Hierzu wollte ich einfach den jeweiligen ComboBoxen als DataSource die jeweilige DataTable des
    ​Datenmodells zuweisen, als ValueMember die Berechtigungsstufe (Integer) und als
    ​DisplayMember den zur Berechtigungsstufe gehörigen Namen (String) zuweisen.

    ​Dann musste ich feststellen das sich bei einer Änderung einer ComboBox alle ComboBoxen mit der
    selben DataSource synchron Mitändern.

    ​Genau das ist nicht gewollt!

    ​Und ich suche einen einfachen und eleganten Weg dies zu verhindern und jeder ComboBox ein autarkes
    Verhalten zu ermöglichen.

    ​Hier mal das Datenmodell und das Formular zum einstellen der notwendigen Berechtigung für die
    jeweilige Aktion. (Diesmal mit der Forenuploadfunktion ;) ​)




    ​Wie kann ich dies im Designer elegant lösen? Oder ist es der Richtige Weg jeder ComboBox eine neue eigene
    ​BindingSource zuzuweisen?
    Oder soll ich etwa im Code den Inhalt der DataTable in ein Array überführen und dieses jeweils geclont an die
    einzelnen ComboBoxen weitergeben?
    Ich sehe noch garnet, dass das DAtenmodell überhaupt irgendwie aufgeht. Weil da fehlen ja Berechtigungs-Datensätze.
    Also Rollen hast du bereits, und die Combos wählen je eine Rolle aus. (Du siehst sogar 3 verschiedene Rollen je User vor - das ist ungewöhnlich und auch ungewöhnlich komplex.)
    Aber die den Rollen zugeordnete Berechtigung hast du einfach hardcodet in die Labels geschrieben - damit wüsste ich nicht, wie man damit arbeiten soll, weil wenn das Form geschlossen wird, sind die Labels ja weg.

    Also wie schon gesagt: ein richtiges klassisches Rollenmodell muss her, wo einer Rolle verschiedene Berechtigungen zugeordnet werden können.

    Und dann wird auch das Gui ganz einfach, denn dann kannst du mit Datagridviews arbeiten, und mit DatagridViewComboboxColumns.
    Und bei DatagridViewComboboxColumns braucht man erfreulicherweise nur eine BindingSource für die ganze Column, also das BindingSource-Gewusel reduziert sich auf ein erträgliches Mass.

    ErfinderDesRades schrieb:

    Also wie schon gesagt: ein richtiges klassisches Rollenmodell muss her, wo einer Rolle verschiedene Berechtigungen zugeordnet werden können.


    ​Ok, dies klingt erstmal nicht schlecht und auch das ganze in einem DataGridView darzustellen klingt nicht schlecht.
    ​Ich werde mir das nochmal mit den genannten Anregungen anschauen und etwas herum experimentieren.

    ​In der Zwischenzeit sind mir auch selbst noch ein oder zwei Ideen in den Sinn gekommen, die ich mal antesten werde.

    ErfinderDesRades schrieb:

    Ich sehe noch garnet, dass das DAtenmodell überhaupt irgendwie aufgeht. Weil da fehlen ja Berechtigungs-Datensätze.

    ​Die Datensätze kommen aus einer XML und diese wird bei öffnen des Formulars eingeladen.

    ​Die Auswahl aus den Comboboxen, bzw. die Notwendigen Rechte werden zur Zeit noch, beim Klick auf Ok des Formulars,
    ​in einer INI-Datei abgespeichert.
    ​Und beim Start des Programms ausgelesen und in einer Klasse "Berechtigungen" gespeichert, welche die gesamte
    Laufzeit über erhalten bleibt.

    ​Klingt vielleicht jetzt alles recht kompliziert und durcheinander, ist aber eigentlich sehr simpel und sehr stabil.

    Ruzbacky schrieb:

    kompliziert und durcheinander

    Jo, bisserl.
    Also da fährt eine Ini rum, eine xml, und eine Klasse Berechtigungen gibts auch noch.

    Wenn man DatasetOnly konsequent anwendet, dann kann man damit alles abdecken, und das vereinfacht dann enorm.

    zB Ini-File ist vollkommen outDated - das geht alles in die Xml-Datei rein, die das typDataset dir generiert, wenn du es mit Dts.WriteXml() abspeicherst.
    Und vielw Probs sind damit aufgelöst, v.a. Probleme, Berechtigungen aus dem Ini-File mit iwelchen anneren Datensätzen von sonstwoher zu verknüpfen.

    Weil wenn alles im Dataset untergebracht ist, dann kann man das dort auch äusserst komfortabel und v.a. zuverlässig miteinander verknüpfen.