Fragensteller
Perform Click in formload

Allgemeine Diskussion
-
Hallo, ich möchte wenn meine Form startet eine funktion ausführen, die in der clickmethode eines buttons steht. aber irgendwie führt er die perform click methode nicht aus. woran kann das liegen?
- Typ geändert Robert BreitenhoferModerator Dienstag, 9. August 2011 14:46 Keine Rückmeldung des Fragenstellender
Alle Antworten
-
Hallo,
hilfreich wäre zu wissen, an welcher Stelle Du PerformClick aufrufst.
Ausführen sollte man das erst wenn das Formular vollständig aufgebaut ist - z. B. im Form.Shown Ereignis
Intern werden zuvor weitere Dinge wie Validation ausgeführt, schlägt die fehl,
wird der Ereignis-Behandlungsmethode von Click nicht ausgeführt.Gruß Elmar
-
Hallo B.,
es kann daran liegen, dass Du dies im Konstruktor der Form aufgerufen hast (dies vorweg, auch, wenn Du im Titel Form_Load angegeben hast).
Dort funktioniert es normal nicht, wenn Du normal über den Designer gearbeitet hast. Das liegt daran, dass es in dem Moment, wo man:Controls.Add(button1);
aufruft, an die Existenz der Form (-Container) Instanz gekoppelt wird. Da diese aber im Konstruktor noch nicht existiert, geht das nicht. Würdest Du ohne Controls.Add arbeiten, würde es sogar im Konstruktor der Form funktionieren. Das ganze hat nichts mit Form.Shown-Ereignis zu o.ä. zu tun, man kann PerformClick() auch schon im überschriebenen "OnCreateControl" oder Form_Load o.ä. (auch, wenn man über Designer gearbeitet hat) funktionierend aufrufen.
Wenn Du es aus Form_Load aus aufrufst, sollte auch Visible der Form auf true stehen (und enabled [Edit: s. Marcels Posting]), was der Button erben würde. (Visible true des Buttons mal vorausgesetzt).
ciao Frank
-
Hallo B. und Elmar,
Zusätzlich zu Elmars Bemerkungen: Damit PerformClick() funktioniert, muss der Button auch aktiviert (Enabled) und sichtbar (Visible) sein. Und er muss selbstverständlich über ein valides Handle verfügen (was alles auch auf den Container des Buttons zutrifft).
Form.Load bzw. Form.Shown (wie von Elmar vorgeschlagen) sind Handler, wo man PerformClick() - technisch gesprochen - einigermaßen sicher aufrufen kann. Während der Konstruktion des Formular wird eben noch gar nicht garantiert, dass das Formular überhaupt über ein Handle verfügt (da Du aber den Aufruf sowieso lt. Titel im Form.Load-Handler machst, betrifft Dich der Konstruktor-Teil ja gar nicht).Aber: Wenn Du PerfomClick schon im Form.Load aufrufst, also bevor das Formular angezeigt wurde, stimmt etwas mit der Logik des Formulars garantiert nicht. Überprüfe ggf., ob Du den Click-Handler-Code nicht zu einer eigenen Methode extrahieren (oder anderweitig umgestalten) kannst.
Gruß
Marcel
-
Hallo Marcel,
- Du schriebst: "... dass das Formular überhaupt über ein Handle verfügt ..."
das ist nicht relevant, PerformClick funktioniert auch ohne, dass der Handle erzeugt ist:
public Form1() { InitializeComponent(); Button btn = new Button(); btn.Click += (s, e) => MessageBox.Show("Button geklickt"); btn.PerformClick(); if (!this.IsHandleCreated) MessageBox.Show("Der Handle war noch nicht erzeugt"); }
ciao Frank -
Input:
using System; using System.Windows.Forms; namespace WindowsFormsApplication1.Forms { public partial class PerformClickForm : Form { public PerformClickForm() { InitializeComponent(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); ButtonClick(); } private void ButtonClick() { TextBox tb = new TextBox(); this.Controls.Add(tb); Button btn = new Button(); this.Controls.Add(btn); string step = "Anfang"; btn.Click += (s, e) => { Console.WriteLine("Button geklickt " + step); }; btn.PerformClick(); step = "Unsichtbar"; this.Visible = false; btn.PerformClick(); step = "Sichtbar"; this.Visible = true; btn.PerformClick(); step = "Deaktiviert"; this.Enabled = false; btn.PerformClick(); step = "Aktiviert"; this.Enabled = true; btn.PerformClick(); step = "Validating"; tb.Validating += new System.ComponentModel.CancelEventHandler(tb_Validating); tb.Focus(); tb.Text = "Dummy"; btn.PerformClick(); step = "Kein Validating"; tb.Validating -= new System.ComponentModel.CancelEventHandler(tb_Validating); btn.PerformClick(); this.Controls.Remove(tb); this.Controls.Remove(btn); step = "Ende"; btn.PerformClick(); } void tb_Validating(object sender, System.ComponentModel.CancelEventArgs e) { Console.WriteLine("Validating Cancelled"); e.Cancel = true; } } }
Output:Button geklickt Anfang Button geklickt Sichtbar Button geklickt Aktiviert Validating Cancelled Button geklickt Kein Validating Button geklickt Ende
-
Hallo Elmar,
Dein Code hat jetzt nichts mit dem nicht relevanten Handle zu tun, aber Du hast mit Deinem Code ein Beispiel gemacht, dass meinen Hinweis aus meinem ersten Posting bestärkt (und später auch Marcels, und jetzt auch Du), dass Enabled und Visible notwendig ist.
Das Control.Add Verhalten ist ja auch schon in meinen Beispielen ersichtlich.Aber Danke, es hilft sicher auch dem Fragenden :-)
ciao Frank -
Frank schrieb: "Du schriebst: ''... dass das Formular überhaupt über ein Handle verfügt... " [...] das ist nicht relevant, PerformClick funktioniert auch ohne dass der Handler erzeugt ist.
Hm. Ich schrieb: "Form.Load bzw. Form.Shown (wie von Elmar vorgeschlagen) sind Handler, wo man PerformClick() - technisch gesprochen - einigermaßen sicher aufrufen kann. Während der Konstruktion des Formular wird eben noch gar nicht garantiert, dass das Formular überhaupt über ein Handle verfügt."
Marcel
-
Sehr geehrter Herr Dzaebel,
> ... es hilft sicher auch dem Fragenden :-)Ihre Wahrheiten scheinen sich im Lauf der Zeit zu verändern:
Mein Thunderbird-Eintrag vom 30.7. um 15:03 Uhr erklärt mir Sie hätten geschrieben:
Wenn Du es aus Form_Load aus aufrufst, sollte auch Visible der Form auf true stehen, was der Button erben würde. (Visible true des Buttons mal vorausgesetzt).
Das Forum zum Zeitpunkt dieses Beitrags:
Wenn Du es aus Form_Load aus aufrufst, sollte auch Visible der Form auf true stehen (und enabled), was der Button erben würde. (Visible true des Buttons mal vorausgesetzt).
(Und dies ist nicht das erste mal mir solche Diskrepanzen auffallen)
Sie sollten sich fragen, ob solch ein Vorgehen dem Fragenden hilft,
Gruß Elmar
wenn er Beiträge regelmäßig auf neue Erkenntnisse zu prüfen hat
und dies nicht durch Änderungsvermerke ersichtlich ist.
-
Hallo Elmar,
ich erwähnte zuerst Visible, danach Du und Marcel.
Enabled habe ich nachgetragen (siehe Marcels Posting, weil es ebenso richtig ist).Das was Du jetzt geschrieben hast, war aber nichts neues, sondern hat nur das bestätigt, was wir gesagt haben.
ciao Frank -
Sehr geehrter Herr Dzaebel,
> ich erwähnte zuerst Visible,..
Hier findet kein Wettrennen statt.
Das PerformClick keine Sonderbehandlung erfährt, sondern wie bei der Ereignisbehandlung
durch Tastatur und Maus durchgeführt wird, ist bereits meiner Aussage zu entnehmen.Weiteres werde ich auf Rückmeldungen des Fragenden äußern.
Mit freundlichen Grüßen
Elmar Boye -
Hallo Marcel,
wenn Du es anders gemeint hast, ist es ja ok (kein Problem), es sollte nur klar sein, dass die Erzeugung des Form Handle nicht für PerformClick notwendig ist.
- ... technisch gesprochen - einigermaßen sicher.
"einigermaßen" wäre eine sehr vage Formulierung ;-)
PerformClick ist hier IMHO so, wie ich es in meinem ersten Posting beschrieben habe (und Du noch mit "Enabled" ergänzt hast) anwendbar und hat eigentlich nichts mit Form_Load oder Form_Shown zu tun. Das .NET Handling ist hier ganz deterministisch in diesem Punkt.
Was Du wahrscheinlich sagen willst, dass wenn man sich auf bereits erstellte Control im PerformClick beziehen würde, dann natürlich ggf. diese Controls nicht erstellt sein würden - und so ggf. Funktionalität fehlschlagen kann - ACK.
Aber ein PerformClick (bzw. der Handler eines Click-Ereignisses) kann ganz andere Dinge aufrufen, die 100% unterstützt sind.
Also nimm es einfach als Versuch, das etwas präziser auszudrücken, denn es wäre fatal, wenn der Eindruck entstehen würde, das PerformClick erst dann ausgeführt werden könnte, wenn Form_Shown Ereignis geworfen wäre, oder etwa ein Handle erzeugt sein muß.
ciao Frank
-
Elmar,
Du hast jetzt Teile von meinen/unseren Aussagen über Code wiederholt. Das ist ok, ...
aber es stehen leider auch Dinge wie:
- Ausführen sollte man das erst wenn das Formular vollständig aufgebaut ist - z. B. im Form.Shown Ereignis
drin, was (sorry) technisch Unsinn ist.
ciao Frank -
Sehr geehrter Herr Dzaebel,
was Sie als "technischen Unsinn" bezeichnen, ist praktische Realtität.
Denn was Sie geflissentlich neben Ihren Oberflächlichkeiten[1] übersehen -
hat das Click-Ereignis in realen Programmen einen realen Inhalt.Nämliches Problem ist einem realen Programmierer in einem realen Programm unterlaufen,
ebenso wie das nicht berücksichtigen der Validation. (Dort: Datenbindung)
Nicht nur Sie beschäftigen sich seit längerem mit dieser älteren Technologie.Die übrige Nabelschau, die hier stattfindet, kann bei dieser ebenso eintreten.
Da visuell erkennbar sollten sie nach dieser ausschweifenden Diskussion von Nichtigkeiten
dem Fragesteller genügend präsentiert worden sein.Mit freundlichem Gruß
Elmar Boye[1]
Der eigentliche Anlass für Input wie Output war, dass Steuerelement (Button)
gewöhnlich nicht frei in der Welt raumlaufen, sondern ihrem Papa (Parent) folgen -
sprich ein Fehlen von this.Controls.Add(btn); in Ihrem Beitrag von gestern.
Womit das Verhalten ein anderes wird - zu überprüfen, in dem man die Zeile in meinem Beispiel auskommentiert.(Aber Wahrheiten sind ja anpassbar in diesem Forum)
-
Elmar,
Deine Behauptung mit Form_Shown ist technisch Unsinn.
Scheinbar hast Du auch noch nicht das Thema "Controls.Add" aus meinem Posting verstanden. Erst Form_Shown abzuwarten, ist auch dann nicht nötig, wenn Controls.Add(btn) durchgeführt wurde.
ciao Frank -
Sehr geehrter Herr Dzaebel,
und Sie scheinen nicht begreifen zu wollen, dass IHR Verhalten diesem Forum nicht zum Vorteil gereicht.
Bei der gleichbleibend niedrigen Zahl und dem Niveau der Fragen
in diesem Forum zu urteilen, scheinen auch andere zu dieser Ansicht gekommen zu sein.Ich werde mich hier nicht weiter beteiligen.
Mit freundlichem Gruß
Wenn Sie Langeweile haben, suchen Sie sich bitte andere...
Elmar Boye
-
Elmar,
wenn Du jetzt persönliche Angriffe machen willst, ist das Dein Problem.
Für ist nur fachlich technisch wichtig, dass eine Form-Shown-Abhängigkeit bei PerformClick nicht existiert.
Ich kann auch gerne noch einmal ein Code-Beispiel machen, dass das verdeutlicht und auch zeigt, dass PerformClick bei Form_Load oder OnCreateControl (siehe mein erstes Posting ... also vor Shown) korrekt funktioniert. Die Beschränkungen mit Visible habe ich bereits aufgeführt und Enabled auch Marcel.
ciao Frank