Controls einer Form finden
-
Hallo,
wie kann ich alle Controls (Buttons, Labels, etc.) einer Form "finden"?
Control.ControlCollection coll = this.Controls; foreach (Control c in coll) { if (c != null) { .... } }
Problem ist, dass sich u.a. ein TabControl auf der Form befindet. Und alle Controls auf bzw. innerhalb des TabControl werden in oben geschriebener Auflistung nicht angezeigt.
Geht das generell nicht was ich vor habe - also wirklich alles anzuzeigen oder wie müsste ich den Code ändern?
-
Prüfe ob das Control untergeordnete Controls hat, wenn dem so ist, gehst du jedes einzelne UnterControl ebenfalls durch.
In Pseudo-Code:
Begin Control[] FindeControls(Control) begin iteration über die controls Füge Control zur Auflistung der Controls hinzu begin gibt es untercontrols? füge Ergebnis von FindeControls(UnterControl) zu Collection hinzu end end End
Da mir eh grad langweilig war bin ich mal so frei, aber gewöhn dich nicht dran.
private Control[] GetAllControls(Control parent) { List<Control> controls = new List<Control>(); if (parent.HasChildren) { foreach (Control ctrl in parent.Controls) { controls.Add(ctrl); if (ctrl.HasChildren) controls.AddRange(GetAllControls(ctrl)); } } return controls.ToArray(); }
-
@inflames2k
Vielen Dank erst mal!Leider schaffe ich es nicht, die Name der Elemente anzuzeigen.
Hier Mein Aufruf bzw. das Füllen in eine Combobox (diese bleibt "leer" - es werden zwar Elemente hinzugefügt, aber eben nur als weiße/leere Zeile).List<Control> availControls = GetControls(this); cbControls.Items.AddRange(availControls.ToArray());
-
Du gehst das ganze auch falsch an.
Häng die Liste direkt als DataSource an die ComboBox und setze den DisplayMember auf "Name".
List<Control> controls = GetControls(this); cbControls.DataSource = controls; cbControls.DisplayMember = "Name";
-
Klappt bei mir leider nicht ... (Liste hat aber den richtigen Inhalt)
// so gehts nicht cbControls.DisplayMember = Name; // und so wird leider auch nichts angezeigt cbControls.DisplayMember = "Name";
-
comboBox1.Items.AddRange(GetAllControls(this));
comboBox1.DisplayMember = "Name";
-
Super vielen Dank!
Gibt es auch eine Möglichkeit, alle Namen der Forms zu erhalten, auch wenn diese nicht geöffnet sind?
Mit dem Code erhalte ich eben nur die geöffneten Forms.
Form f = Application.OpenForms["Form1"];
-
Naja, wie willst du das denn anstellen?
Für den Fall müssten alle Formulare bereits instantiiert sein. Im normal-Fall werden Forms aber dann instantiiert, wenn man diese braucht.
-
AnjaMerk schrieb:
Gibt es auch eine Möglichkeit, alle Namen der Forms zu erhalten, auch wenn diese nicht geöffnet sind?
Was willst Du denn erreichen?
-
µ schrieb:
Was willst Du denn erreichen?
Den Ansatz einer Benutzerverwaltung.
Diese sollte über die Controls gemacht werden - dafür würde ich eben gern jedes Control zu jeder Form in die DB speichern und darauf dann die Gruppenrechte setzen.
-
Überdenk das noch einmal. Das wird auf dauer zu kompliziert.
Eine Rechteverwaltung für jedes einzelne Control klingt für mich auch arg komisch.
-
Ich habe sonst keine andere Idee
Allein auf die Forms kann ich es eigentlich kaum machen. Manche Nutzer dürfen ja zumindest einen Teil auf einer Form sehen oder bestimmte Befehle ausführen.
Was würde es sonst für eine Möglichkeit geben?
-
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.