Hallo,
wie kann man an Hand des Methoden-Names feststellen, ob eine Klasse bzw. ein Object (Control) einen Verweis auf diese Methode hat.
Ich möchte alle Controls eines Forms auslesen und prüfen ob das jeweilige Control die gesuchte Methode aufweist und diese dann aufrufen.
Ist das überhaupt möglich?
Gruss und Danke
Hallo kkirchhoff,
ja, das ist per Reflection möglich, aber kein gutes Design.
Besser wäre es, zu versuchen, deine Controls in einen bestimmten Typ zu casten und auf diesen stark typisierten Controls die Zielmethode aufzurufen:
foreach (Control control in myControlCollection)
{
// Cast vornehmen
Button button = control as Button;
// Ist control vom Typ Button (oder vom Typ einer abgeleiteten Klasse von Button)?
if (button != null)
{
// Ja, also Methode aufrufen
button.PerformClick();
}
}
m0rius
[edit]Kommentare hinzugefügt.[/edit]
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Danke für die Antwort, ich denke das werde ich wohl dann auf diesen Weg machen.
Nun möchte ich gern eine generische Funktion schreiben und aus einen ChildWindow, welches ich als Parameter übergeben alles Controls auslesen.
private bool isFormValide(ChildWindow _inRootElement)
{
foreach (UIElement UiElement in (_inRootElement))
{
MessageBox.Show(UiElement.ToString());
}
}
Nur ich bekomme immer diesen Fehler.
**Eine foreach-Anweisung kann nicht für Variablen vom Typ "System.Windows.Controls.ChildWindow" verwendet werden, da "System.Windows.Controls.ChildWindow" keine öffentliche Definition für "GetEnumerator" enthält. **
Was mache ich falsch? Vielleicht hat ja jemand auch ein Beispiel.
Danke
Hallo kkirchhoff,
bitte beachte [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen) und [Hinweis] Wie poste ich richtig? Punkt 1.1.1 — das sind Grundlagen.
_inRootElement
ist vom Typ ChildWindow
. Die foreach
-Schleife kann nur über Typen iterieren, die IEnumerable
implementieren, und das tut ChildWindow
nicht.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Hallo m0rius,
danke für die Antwort. Das es ein Compilerfehler ist weis ich. Mir ist der Fehler auch klar. Vielleicht habe ich meine Frage nicht richtig gestellt. Ich such eine Lösung oder eine Hilfe, wie ich bei einem ChildWindow die Controls auslesen kann.
Also wenn mir jemand helfen kann, fände ich das prima.
Danke
Hallo kkirchhoff,
ChildWindow
ist von ContentControl
abgeleitet und besitzt deshalb eine Content
-Eigenschaft vom Typ object
— es enthält somit nur ein Kindelement! Dieses ist meist ein StackPanel
oder irgendein anderes Panel
, dessen Kindelemente du wiederum mit der Panel.Children-Eigenschaft vom Typ UIElementCollection auslesen kannst.
m0rius
[edit]Vererbungshierarchie eingefügt.[/edit]
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Hallo kkirchhoff,
dein Vorgehen ist nicht so gut. Ich würde stattdessen lieber die Möglichkeiten von WPF ausnutzen. Es mag sein, dass es Situationen gibt, an denen man das Problem nur so - wie du es jetzt macht - lösen kannst. Trotzdem würde ich dir raten, vorher zu überlegen, ob es nicht doch der falsche Weg ist.
Hallo m0rius,
eine Anmerkung von mir: Im ersten Codebeispiel von dir wird nicht geprüft, ob sich in myControlCollection nur Buttons befinden bzw. ob das jeweilige Item auch vom Typ Button ist. Es wäre besser, wenn du vor
Button button = control as Button;
prüfst, ob nicht control ein Button ist, sprich
if(control is Button) { /* */ }
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Hallo zero_x,
Ich würde stattdessen lieber die Möglichkeiten von WPF ausnutzen.
die da konkret wären? Die Möglichkeit, Controls anhand ihres Namens zu finden? Ohne weitere Ausführungen ist der Hinweis – sorry – nicht so hilfreich.
Im ersten Codebeispiel von dir wird nicht geprüft, ob sich in myControlCollection nur Buttons befinden
Richtig, es können in myControlCollection
auch andere Controls enthalten sein. So what 😃?
bzw. ob das jeweilige Item auch vom Typ Button ist. Es wäre besser, wenn du vor [...] prüfst, ob nicht control ein Button ist
Diese Überprüfung wäre völlig sinnlos, da ich bereits mit dem as
-Operator caste. Ist control
nicht vom Typ Button
, enthält button
den Wert null
. Ausführlich wird der as
-Cast im Artikel [Tipp] Casten aber richtig: Begriffe wie Cast / is / as besprochen.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
@zero_x :
if(control is Button) { /* */ }
Im Gegenteil, wenn du FxCop einsetzt wird dir diese Vorgehensweise als falsch angekreidet.
Richtig ist was M0rius hier vorgeschlagen hat, erst per "as" umwandeln und dann auf null prüfen.
Dein Vorschlag würde im Fall das es ein Button ist 2 mal "casten" was nicht gut ist.