Forums Neueste Beiträge
 

ToolStripMenuItem.PerformClick-Event geht bei Form.Visible = false nicht mehr,...

03/05/2009 - 12:44 von Kerem Gümrükcü | Report spam
Hallo,

ich habe leider selber nicht viel dazu gefunden, aber
folgendes Problem hat sich ergeben: Ich habe eine
Form, die auf visible false gestellt wird. Die Form hat
dann ein trayicon das dynamisch ToolStripMenuItem's
erzeugt, die über einen Index zu den ToolStripMenuItem's
auf dem Form gemappt werden. Wird eines der Tray
ToolStripMenuItem's angeklickt, wird das eigentliche
ToolStripMenuItem auf dem Form mit PerformClick()
zum ausführen der Click-Methode gebracht, zumindest
sollte es das, aber leider passiert da nichts, d.h die Methode
wird nicht aufgerufen. Da zur Laufzeit nicht bekannt ist,
welches ToolStripMenuItem des Trayicons angeklickt wird,
kann ich auch keine Methode "direkt" aufrufen. Welche
Möglichkeit habe ich nun, ohne vorher zu wissen welches
ToolStripMenuItem angeklickt wird, das mit einem Handler
ausgestattete ToolStripMenuItem auf dem Form dazu zu bringen,
die Handler-Methode aufzurufen? Ich hoffe das war soweit
klar,...

Anscheinend ist es nicht möglich, ein ToolStripMenuItem
auf einem form das Visible = false ist mit einem PerformClick()
dazu zu bringen, das es den darunterliegenden Code ausführt.
Im Netz habe ich dazu auch keine richtige "Erklàrung" gefunden,
bis auf ein beispiel, das mir die Implementierung von PerformClick()
zeigt und damit eine vermutung bei mir aufgehen làsst:

// Add implementation to the IButtonControl.PerformClick method.
public void PerformClick()
{
if(this.CanSelect)
{
this.OnClick(EventArgs.Empty);
}
}

Ich habe das so gelöst:

ToolStripMenuItem.Select();
ToolStripMenuItem .PerformClick();

was ohne Probleme geht, aber kann
man da nicht vielleicht was mit Reflection
machen, d.h. die Methode die dem Event
zugewiesen wurde irgendwie ermitteln
und dann aufrufen, wie man das z.b. für
MethodInfo.Invoke() machen kann?


Danke schon mal,...


Grüße

Kerem

Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.pro-it-education.de/soft...iceremover
Latest Open-Source Projects: http://entwicklung.junetz.de
"This reply is provided as is, without warranty express or implied."
 

Lesen sie die antworten

#1 Frank Dzaebel
03/05/2009 - 18:18 | Warnen spam
Hallo Kerem,

[dynamisches ToolStripMenuItem-Click auslösen
.. bei: Form.Visible == false] [...] wie man das z.b. für
MethodInfo.Invoke() machen kann?



man kann "zum Teil" folgende pragmatische
Workarounds nutzen (bekannt gefàhrlich, da
private Variablen benutzt werden, also auf eigene
Gefahr) :

public void FireEvent(object ctl, string eventName)
{
MethodInfo onClickMethod = ctl.GetType().GetMethod(
"On"+eventName, BindingFlags.Instance |
BindingFlags.NonPublic);
onClickMethod.Invoke(ctl, new object[] { null });
}

// Aufruf etwa: FireEvent(toolStripButton1, "Click");
________

Sauberer wàre es vom OOP-Gesichtspunkt z.B., die
ToolStripMenuItem's zu subclassen und dort eine
Methode zum Click (über überschriebenes OnClick)
öffentlich zu machen.
Oder, da Du ja wohl die Click-Handler dynamisch
erzeugt hast, kannst Du diese natürlich auch dynamisch
direkt über den Namen invoke'n.
______

Oder als visueller Trick etwas wie:

this.Opacity = 0.01; // ShowInTaskbar = false;
Visible = true; toolStripButton1.PerformClick();
Visible = false; this.Opacity = 1;


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen