Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Herausfinden, ob eine Klasse bzw. Object eine bestimme Methode oder Ereignis hat
kkirchhoff
myCSharp.de - Member



Dabei seit:
Beiträge: 118

Themenstarter:

Herausfinden, ob eine Klasse bzw. Object eine bestimme Methode oder Ereignis hat

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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]
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von m0rius am .
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
private Nachricht | Beiträge des Benutzers
kkirchhoff
myCSharp.de - Member



Dabei seit:
Beiträge: 118

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
kkirchhoff
myCSharp.de - Member



Dabei seit:
Beiträge: 118

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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]
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von m0rius am .
Attachments
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
private Nachricht | Beiträge des Benutzers
kkirchhoff
myCSharp.de - Member



Dabei seit:
Beiträge: 118

Themenstarter:

beantworten | zitieren | melden

Hallo m0rius,

danke Dir .. ich denke das hilft mir sehr weiter :-)
private Nachricht | Beiträge des Benutzers
zero_x
myCSharp.de - Member

Avatar #avatar-2567.gif


Dabei seit:
Beiträge: 1069
Herkunft: Koblenz

beantworten | zitieren | melden

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 | myCSharp.de - gemeinsam mehr erreichen

Für längere Zeit inaktiv.
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

Hallo zero_x,
Zitat von 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.
Zitat von zero_x
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 :)?
Zitat von zero_x
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
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10076

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers