Controls einer Form finden



  • inflames2k schrieb:

    Eine Rechteverwaltung für jedes einzelne Control klingt für mich auch arg komisch.

    Für dich vielleicht, für die Kunden meines vorherigen Arbeitgebers war dies eine Anforderung. Zielsetzung war, das Felder unter anderem Ausgeblendet werden konnten (Und das glaube ich auch noch in Abhängigkeit einer Art [z.B. bei der Adressverwaltung ob es sich um einen Kunden, Lieferanten... gehandelt hat]).

    Die Felder wurden aber bei uns initialisiert (sprich es musste jedes Fenster in einem speziellen Startmodus einmalig geöffnet werden, um den aktuellen Stand in die Datenbank zu übertragen, und dann wurden Änderungen an die Kunden per Script übertragen).



  • Naja, die Frage ist aus meiner Sicht ob man nicht schon vorher festlegen könnte, welche Gruppen es gibt, und was diese sehen dürfen.

    Ansonsten ist es bei größeren Anwendungen (ich weis ja nicht, in welchem Rahmen die Anwendung von AnjaMerk ist), ein riesiger Aufwand das ganze zum einen zu Implementieren (Anwendung, Datenbank), zum anderen aber auch ein enormer Verwaltungsaufwand für den Endkunden.



  • Naja, die Gruppen könnten durchaus noch festgelegt werden.
    Auf was sollte denn dann geprüft werden? Nur die Forms?

    Wobei ich es grad eh nicht schaffe, die Daten in die Datenbank zu bekommen:

    ...
    using (var connection = new MySqlConnection(constring))
                {
                    connection.Open();
                    StringBuilder stringBuilder = new StringBuilder();
                    stringBuilder.Append("INSERT INTO tblformcontrol(formID, controlelement) ");
                    stringBuilder.Append("VALUES (?formID, ?element)");
                    String query = stringBuilder.ToString();
    
                    using (var command = new MySqlCommand(query, connection))
                    {
                        for (int i = 0; i < r; i++)
                        {
                            command.Parameters.AddWithValue("?formID", MySqlDbType.Int32).Value = formID;
                            command.Parameters.AddWithValue("?element", MySqlDbType.Text).Value = controlList.Name;
                            var da = new MySqlDataAdapter();
                            da.InsertCommand = command;
                            da.InsertCommand.ExecuteNonQuery();
                            command.Parameters.Clear();
                        }
                    }
                }
    ...
    

    Obwohl das Datenbankfeld controlelemt vom Typ VARCHAR(255) ist, erscheint [i]Die Eingabezeichenfolge hat das falsche Format.* 😕



  • AnjaMerk schrieb:

    Naja, die Gruppen könnten durchaus noch festgelegt werden.
    Auf was sollte denn dann geprüft werden? Nur die Forms?

    Du könntest Beispielsweise bei jedem Control die Gruppenbezeichnung(en)/GruppenID(s) als Tag hinterlegen.

    string adminGUID = GUID.NewGuid();
    string superAdminGUID = GUID.NewGuid();
    ListView lvEmploeyes = new ListView();
    lvEmploeyes.Tag = adminGUID;
    Button btnAddEmploeye = new Button("Hinzufügen");
    btnAddEmploeye.Tag = String.Concat(adminGUID, ";", superAdminGUID);
    

    Später bei der Rechteprüfung würde es ausreichen, wenn du die GruppenID's nach der Anmeldung zurück lieferst.

    Controls[] myControls = GetAllControls(this);
    foreach(Control ctrl in myControls)
    {
         string guids = Control.Tag;
         string[] GroupIDs = guids.Split(new char[] {';'}...);
    
         foreach(string guid in groupIDs)
         {
             ctrl.Enabled = myGroups.Contains(guid);
         }
    }
    


  • @inflames2k
    Sieht recht gut aus bzw. scheint tatsächlich nicht so aufwendig zu sein wie mein bisheriges Vorhaben! Danke schon mal für den Tipp!!
    Wie sieht dann Deine Klasse GUID aus?

    Und wie behältst Du dann den Überblick, welche Gruppen was dürfen? Also gibt es eine Möglichkeit der graphischen Darstellung der Rechte?



  • GUID ist eine Klasse des .NET Frameworks. Vor der Zuweisung zu den Controls solltest du aber prüfen, ob diese bereits ein Tag gesetzt haben. Es soll ja schließlich nicht die bekannte GUID überschrieben werden.



  • Hmm, irgendwie funktioniert es bei mir ... nur leider werden alle Controls .Enabled gesetzt?!
    Hab versucht ne pn zu schicken ... geht nicht 😞



  • Prüf am besten mal welche GUID's dir nach der Anmeldung aus der Datenbank zurück geliefert werden.

    Mir scheint es als hätte der Benutzer schon einmal alle Rechte, was eben dazu führt, dass alle Controls aktiv sind.



  • Für mich zum Verständnis:
    Ich hinterlege zunächst einmalig für jede Control eine Guid im Tag.
    Diese Guid bzw. verketteten Guids werden in der Datenbank gespeichert.

    Beim Start der Form wird dann geprüft ob der Nutzer adminGUID bzw. superAdminGUID ist und dementsprechend die hinterlegten Werte der Guid ausgelesen.

    Das ganze wäre ja für weitere Gruppen erweiterbar - indem weitere Guids verkettet werden?!



  • So in etwa. 🙂 Du musst nur drauf achten, dass du beim beenden die GUIDs irgendwo speicherst und beim nächsten start wieder lädst, sonst überschreibst du die GUIDs immer wieder.



  • Irgendwie klappt es noch nicht so recht. Für den "normalen" User werden die richtigen Controls angezeigt, für den "super" User aber eben nur die anderen, die der normale Nutzer nicht hat (aber eben nicht beides).

    Mit was fülle ich myGroups?

    Ach ja, noch ne Frage zu Deinem Code: Sollte groupIDs in der foreach-Schleife nicht auch GroupIDs heißen?

    string[] GroupIDs = guids.Split(new char[] {';'}...);
    
         foreach(string guid in groupIDs)
         {
             ctrl.Enabled = myGroups.Contains(guid);
         }
    


  • Ja, es sollte in der Schleife genau wie außerhalb heißen.

    "myGroups" - soll die GruppenID's enthalten, denen der Nutzer angehört. - Der Super-Admin hat also groupUser; groupAdmin; groupSuperAdmin.



  • Ich komme einfach auf keinen grünen Zweig ...
    Vermutlich übergebe ich die falsche Gruppe??

    Als SuperAdmin mit allen Rechten wird dann aber nichts angezeigt. 😕

    Hier mal mein Code - ich speicher der Einfachheit halber noch nichts in der DB.

    public partial class F_Guid : Form
        {
            string sGroup;
    
            public F_Guid()
            {
                InitializeComponent();
                GetGuid();
            }
    
    private void GetGuid()
            {
                var userGuid = Guid.NewGuid();
                var adminGuid = Guid.NewGuid();
                var superAdminGuid = Guid.NewGuid();
    
                sGroup = String.Concat(userGuid, ";", adminGuid, ";", superAdminGuid);
                //sGroup = String.Concat(adminGuid, ";", superAdminGuid);
                //sGroup = userGuid.ToString();
                //sGroup = adminGuid.ToString();
                //sGroup = superAdminGuid.ToString();
    
                SetTags(userGuid.ToString(), adminGuid.ToString(), superAdminGuid.ToString());
            }
    
    private void SetTags(string userG, string adminG, string superAdminG)
            {
                lbMasterData.Tag = String.Concat(userG, ";", adminG, ";", superAdminG);
                btnMasterData.Tag = String.Concat(superAdminG);
    
                GroupPolicy();
            }
    
    public void GroupPolicy()                     
            {
                ArrayList myGroups = new ArrayList() { sGroup } ;
    
                ArrayList myControls = DatabaseAdministration.GetAllControls(this);
                foreach (Control ctrl in myControls)
                {
    
                    string guids = ctrl.Tag.ToString();
                    string[] GroupIDs = guids.Split(new char[] { ';' });
    
                    foreach (string guid in GroupIDs)
                    {
                        ctrl.Enabled = myGroups.Contains(guid);
                    }
                }
            }
    


  • sGroup ist "guid;guid;guid" als string

    Dann hast Du:
    ArrayList myGroups = new ArrayList() { "guid;guid;guid" }

    und prüfst
    myGroups.Contains(guid)

    Das Contains bezieht sich auf die ArrayList (die sowieso scheiße ist) und die Arraylist
    enthält keine einzelnen GUID-Strings, sondern nur das konkatenierte Monster da oben.

    Bitte verwende den Debugger. Das hättest Du selbst innerhalb von 30 Sekunden rausfinden können,
    sobald der Debugger in der inneren foreach angekommen wäre



  • Ok, ich werde anstatt ArrayList List<T> benutzen.

    Habe nun in myGroups anstatt einen String die drei Guids übergeben => 3 Gruppen.
    Dennoch wird nicht richtig "ausgewertet".
    Mach ich mit der Zuweisung der Tags was falsch oder fehlt bei der Auswertung nochmal eine Abfrage auf die Gruppe.

    Entschuldige bitte, aber seh grad den Wald vor lauter Bäumen nicht mehr 😕



  • Ok. Ein Tipp:

    foreach (string guid in GroupIDs)
    {
    ctrl.Enabled = myGroups.Contains(guid);
    }

    Warum wird ctrl.Enabled hier mehrfach gesetzt?
    Also EIN- und DASSELBE ctrl.Enabled.


Anmelden zum Antworten