Event: Type und seine Verwendung

Hi,

ich würde gern wissen, ob es einen einfachen Weg gibt und wenn ja welchen,
um in einem Event, z.B. click(object sender, …), den Typ des senders
verwenden zu können, um den sender zu casten und so das Objekt zu erhalten.
Ich weiß, dass man mit Type t = sender.getType() den Typ erhält. Weiter weiß
ich leider nicht.

Danke und Gruß
Torsten

Hi!
C# bietet 2 sehr praktische Schlüsselwörter an: is und as. Beispiele:

if (sender is Button)
 MessageBox.Show("Eventhandler durch Button ausgelöst");

oder auch

Button b = sender as Button;
MenuItem mi = sender as MenuItem;
if (b != null)
 MessageBox.Show("Eventhandler von Button "+b.Text+" ausgelöst");
if (mi != null)
 MessageBox.Show("Eventhandler von Button "+mi.Text+" ausgelöst");

Die Kombination as/Abfrage auf null ist dabei ein klein wenig effizienter als die Verwendung von is mit anschließendem Cast, aber den Unterschied wird man wirklich nur in sehr engen Schleifen mit vielen Durchläufen feststellen können.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

danke für die Antwort, aber in deinen Beispielen sind die
Typen fest eingebaut.

Ich wollte folgendes ausprobieren:
Ich wollte so etwas machen, wo ich die Elemente der Form
zur Laufzeit verschieben kann. Dazu schalte ich in den „Edit-Modus“
und wollte dann alle Elemente verschieben. Dazu wollte ich generelle/allgemeine
Maus Events, also im Prinzip generische ohne vorher den Typ fest einzubauen.

Danke und Gruß
Torsten

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi nochmal!

Den Typ musst Du irgendwie immer fest einbauen, ohne das könntest Du nur auf die Eigenschaften und Methoden von object zugreifen und das wird ein wenig zu mager sein…
In Deinem Fall könntest Du ja auf Control testen (wovon praktisch alle bekannten Steuerelemente abgeleitet sind), damit hättest Du Zugriff auf solche Eigenschaften wie Location oder Size , die Du zum Festlegen von Position und Größe auf einem Dialog brauchst.

Was willst du denn sonst mit dem Objekt anfangen, wenn Du den Typ herausgefunden hast?

Falls Du partout gar keine feste Typisierung haben willst, müsstest Du mittels Reflection zur Laufzeit die Eigenschaften des Typs von sender herausfinden und darüber Methoden aufrufen/Eigenschaften setzen. Ist allerdings recht aufwändig und wird daher auch nicht allzu schnell…

Beziehungsweise, nachdem ich Deine Antwort jetzt nochmal gelesen habe, kommt mir noch eine andere Idee: Geht es Dir vll. in Wahrheit darum, nicht bei allen Control die fürs Verschieben nötigen Eventhandler einzuhängen? In diesem Fall hast Du keine Chance, weil Du eben nur für die Controls die Ereignisse erhältst, für welche Du auch Eventhandler registriert hast.

Beim Umschalten in diesen Edit-Modus kannst du dann aber ganz einfach mit

foreach (Control c in this.Controls)
{
 c.MouseDown += new MouseEventHandler(...
}

auf einen Schwung alle Controls abarbeiten (ggf. noch eine kleine rekursive Methode für z.B. Controls auf Panels o.ä.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like

Hi nochmal!

Den Typ musst Du irgendwie immer fest einbauen, ohne das
könntest Du nur auf die Eigenschaften und Methoden von
object zugreifen und das wird ein wenig zu mager
sein…
In Deinem Fall könntest Du ja auf Control testen (wovon
praktisch alle bekannten Steuerelemente abgeleitet sind),
damit hättest Du Zugriff auf solche Eigenschaften wie
Location oder Size , die Du zum Festlegen von
Position und Größe auf einem Dialog brauchst.

Was willst du denn sonst mit dem Objekt anfangen, wenn Du den
Typ herausgefunden hast?

Falls Du partout gar keine feste Typisierung haben willst,
müsstest Du mittels Reflection zur Laufzeit die Eigenschaften
des Typs von sender herausfinden und darüber Methoden
aufrufen/Eigenschaften setzen. Ist allerdings recht aufwändig
und wird daher auch nicht allzu schnell…

Beziehungsweise, nachdem ich Deine Antwort jetzt nochmal
gelesen habe, kommt mir noch eine andere Idee: Geht es Dir
vll. in Wahrheit darum, nicht bei allen Control die fürs
Verschieben nötigen Eventhandler einzuhängen? In diesem
Fall hast Du keine Chance, weil Du eben nur für die Controls
die Ereignisse erhältst, für welche Du auch Eventhandler
registriert hast.

Beim Umschalten in diesen Edit-Modus kannst du dann aber ganz
einfach mit

foreach (Control c in this.Controls)
{
c.MouseDown += new MouseEventHandler(…
}

auf einen Schwung alle Controls abarbeiten (ggf. noch
eine kleine rekursive Methode für z.B. Controls auf Panels
o.ä.

Gruß,
Martin

Hi,

das mit Control werde ich mal ausprobieren.

Die EventHandler hätte ich vorerst alle von Hand reingebaut, bzw. nach Vergleich mit einer bool Variable auf die Verschiebe-Methode umgeleitet, aber deinen Tip mit foreach werde ich auf jeden Fall im Kopf behalten.

Danke
Torsten

Hi,

perfekt, es funzt mit Control so, wie ich es mir erhofft habe.
Danke

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]