Benutzer mit den meisten Antworten
Control-Eigenschaft dynamisch erzeugen

Frage
-
Hallo
Kann ich einem Control irgendwie eine Eigenschaft über Variablen zuweisen?
Danke!
Button btn = new Button(); string key = "FlatStyle"; string value = "FlatStyle.Flat";
btn(key) = value; //Das geht leider nicht !!
PS: Mir ist schon klar, dass man es normalerweise so setzt:
btn.FlatStyle = FlatStyle.Flat;
Antworten
-
Mein Rat: lass es sein. Du kannst zwar dynamisch Eigenschaften setzen und auch wieder auslesen. Auch Objekte erzeugen und Methoden ausführen ist möglich. Vorhandene Objekte Erweitern geht aber nicht. Man kann immer nur das benutzen, was man schon zur Compile-Zeit eingeplant hat.
Mit später mal neuen Objekten irgendwelche neuen Eigenschaften zuzuweisen bringt nichts, da die Klasse selbst nicht darauf eingehen könnte. Eher könnte man hier noch den Weg gehen und die Daten in einem 2. Objekt unterzubringen und dieses irgendwie mit dem Control oder was auch immer zu verknüpfen. Aber auch hier ist wieder die Frage was es bringt. Du kannst zwar Dinge setzen, aber 1. wer macht das und 2. wo wird das am Ende wieder verwendet?
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. November 2015 13:11
- Als Antwort markiert Aleksander Chalabashiev Montag, 30. November 2015 10:35
-
Über die Type.GetType-Methode kannst du das typeof(FlatStyle) umgehen. Beachte hierbei aber das du immer den vollständigen Namespace mit angeben musst.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. November 2015 13:13
- Als Antwort markiert Aleksander Chalabashiev Montag, 30. November 2015 10:36
Alle Antworten
-
Hallo,
es gibt mehrere Wege das zu realisieren:
- du prüfst in einem Switch...case-Statement welchen Wert die Variable hat und setzt dann manuell die jeweilige Eigenschaft.
- Du verwendest Reflection. Das dürfte der einfachste, aber auch Leistungsverschwendenste Weg sein. Über die Activator-Klasse kannst du Objekte anhand von Strings instanziieren.
- Du verrätst uns was du vor hast und uns fallen vielleicht bessere Alternativen ein.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo
Vielen Dank für deine Antwort! Ich werde nun mal die Reflection-Sachen ausprobieren.
Ist so eine Idee von mir, dass man Controls nachträglich anpassen kann ohne neu kompilieren zu müssen . Vielleicht mit Eigenschaften, die es erst in .NET 12.0 gibt :-). Von daher passt die Switch ... case Möglichkeit nicht.
-
Mein Rat: lass es sein. Du kannst zwar dynamisch Eigenschaften setzen und auch wieder auslesen. Auch Objekte erzeugen und Methoden ausführen ist möglich. Vorhandene Objekte Erweitern geht aber nicht. Man kann immer nur das benutzen, was man schon zur Compile-Zeit eingeplant hat.
Mit später mal neuen Objekten irgendwelche neuen Eigenschaften zuzuweisen bringt nichts, da die Klasse selbst nicht darauf eingehen könnte. Eher könnte man hier noch den Weg gehen und die Daten in einem 2. Objekt unterzubringen und dieses irgendwie mit dem Control oder was auch immer zu verknüpfen. Aber auch hier ist wieder die Frage was es bringt. Du kannst zwar Dinge setzen, aber 1. wer macht das und 2. wo wird das am Ende wieder verwendet?
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. November 2015 13:11
- Als Antwort markiert Aleksander Chalabashiev Montag, 30. November 2015 10:35
-
Super ! Es funktioniert an sich!!! Danke!!!
Ich habe jetzt nur noch das Problem, dass ich den String "Flat" in die zugehörige Int32-Zahl der Enum umwandeln muss.
Ich bin nun auf Parse gestossen, aber damit es funktioniert muss ich "typeof(FlatStyle)" hardcoden.
Ich möchte aber flexibel sein, es könnte ja z.B. auch um BorderStyle gehen ...
Wie könnte ich das lösen? Sorry, ich bin Anfänger mit C# ...
Das geht leider nicht:
string key = "FlatStyle";
Int32value = (Int32)Enum.Parse( typeof(key) , valueString);
Button btn = new Button(); string key = "FlatStyle"; string valueString = "Flat"; Type type = btn.GetType(); PropertyInfo prop = type.GetProperty(key); Int32 value = (Int32)Enum.Parse( typeof(FlatStyle) , valueString); prop.SetValue(btn, value, null);
Vielen Dank auch für deine Erläuterungen! Normal mache ich so Sachen auch nicht dynamisch, aber mich interessiert ob sowas an sich realisierbar wäre.
-
Über die Type.GetType-Methode kannst du das typeof(FlatStyle) umgehen. Beachte hierbei aber das du immer den vollständigen Namespace mit angeben musst.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. November 2015 13:13
- Als Antwort markiert Aleksander Chalabashiev Montag, 30. November 2015 10:36