Entwickler-Ecke

WinForms - RichTextBox.Modified reagiert nicht im FormClosing Event


Delete - Mo 14.09.15 12:24
Titel: RichTextBox.Modified reagiert nicht im FormClosing Event
- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Mo 14.09.15 12:51

Wie sollte der sender des Form_Closing eine der RichTextBoxen sein? Ohne das ich es probiert habe gehe ich doch schwer davon aus das es die Form ist.


Th69 - Mo 14.09.15 12:53

Hallo,

der sender beim FormClosing-Ereignis ist natürlich die Form selbst und nicht irgendein darauf platziertes Element.
Du müsstest einfach in einer Schleife alle RichTextBox-Elemente durchlaufen und dann entsprechend darauf reagieren.


Delete - Mo 14.09.15 16:44

- Nachträglich durch die Entwickler-Ecke gelöscht -


Th69 - Mo 14.09.15 17:19

Der Sinn von EventHandler [https://msdn.microsoft.com/de-de/library/system.eventhandler%28v=vs.110%29.aspx] (und dessen generische Variante EventHandler<TEventArgs> [https://msdn.microsoft.com/de-de/library/db0etb8x%28v=vs.110%29.aspx]) besteht darin, eine einheitliche Funktionsweise für alle möglichen Ereignisse anzubieten. Der Sender kann dann je nach Ereignis ein beliebiges Objekt sein - für die speziellen Form-Ereignisse wird daher die auslösende Form und für z.B. ein TextChanged-Ereignis die (Rich)TextBox übergeben.
Und wenn man in einer eigenen Klasse ein Ereignis bereitstellt

C#-Quelltext
1:
2:
3:
4:
class MyClass
{
    public event EventHandler MyEvent;
}

so sollte man beim Auslösen die eigene Instanz der Klasse (this) als Sender übergeben:

C#-Quelltext
1:
MyEvent(this, EventArgs.Empty);                    


Ralf Jansen - Mo 14.09.15 19:25

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Verstehe, dann werde ich mir eine Methode dafür überlegen.
Das Casten scheine ich noch immer nicht verstanden zu haben.
Ich meine, was bringt es mir wenn mir ein object sender zur Verfügung steht, und dieser in dem Beispiel eh nur für die Form gedacht ist?
Dann hätten die Entwickler gleich aus dem Typ object, ein Typ Form machen können, oder etwa nicht?


Ahh, eine Frage für Verschwörungstheoretiker.

Meine Theorie.
Weil es heute nur Form ist, heißt ja nicht das man es nicht anders geplant hat bzw. für anderes offen halten wollte und das es sich nicht noch in Zukunft ändert :)
Versetz dich zurück ins Jahr 2000 du müsstest Winforms designen, es gibt also noch nicht Millionen Entwickler die das ~testen~ dabei Stackoverflow volltexten und wo man einfach nachlesen könnte was der durchschnittliche Entwickler denn braucht, sondern du hast nur eine Handvoll Leute für eine kleine interne und öffentliche Beta, musst aber was abliefern was Jahrzehnte halten soll.
Wenn du noch nicht genau weißt wie sich das in Zukunft entwickelt dann versucht man das so allgemein zu halten wie möglich. Es fällt ja auf das es nicht Control ist sondern sogar nur object. Möglicherweise hatte man im Kopf ~künstliche~ sender objecte zurückzuliefern. Also z.B. bei Grid Events Objekte die Zellen darstellen, oder hier bei FormClosing möglicherweise etwas das die Quelle des closens darstellt (Man möchte z.B. ALT+F4 vom Systemmenu von Close() als unterschiedliche KLassen im Sender unterscheiden). Letztlich sind solche Informationen dann alle in den EventArgs oder andere Klassen die man abfragen muss gelandet. Da sich das so etwas entwickelt hat und Winforms ganz nah an EOL ist sieht das natürlich merkwürdig aus. Aber eben nur im Rückspiegel wenn man den Weg wie es entstanden ist nicht im Kopf hat sondern nur das sich stabilisierte Ergebnis kennt. Vermutlich hatte man sich auch gedacht sender braucht man eh nicht so oft meistens wird ein Event an einem Control hängen und gut. Da ist es nicht tragisch wenn man da rumcasten muss. Besser so als jetzt was zu konkret zu designen und sich dadurch Optionen für die Zukunft zu verbauen. Als EventArgs hat man dann ja was konkretes genommen wenn es nötig ist. Konsequent wäre wenn man die auch immer casten muss wenn man die braucht. Aber da war man sich vermutlich sicher die wird man häufiger brauchen. Da riskieren wir es uns konkret festzulegen. Soweit so spekulativ.

Wenn wir das genau wissen wollen müssten wir hoffen das Microsoft oder jemand anderes mal die ganzen Besprechungsnotizen der Framework Designer veröffentlicht. Microleaks oder so.


Delete - Di 15.09.15 05:52

- Nachträglich durch die Entwickler-Ecke gelöscht -


Th69 - Di 15.09.15 08:09

Hallo,

es ist doch ein schönes Gefühl, wenn man selber zu einer Lösung kommt, so wie deine getControls<T>-Methode (auch wenn du einen Parameter doppelt hast: entweder generisch mittels T oder den Type-Parameter übergeben).
Aber da du nicht der einzige bist, der so etwas öfter mal benötigt, gibt es diese Methode schon im .NET-Framework: Enumerable.OfType<TResult>-Methode [https://msdn.microsoft.com/de-de/library/vstudio/bb360913%28v=vs.100%29.aspx] (d.h. als Erweiterungsmethode) ;-)

Die Anwendung wäre dann z.B.

C#-Quelltext
1:
foreach (RichTextBox rtb in Controls.OfType<RichTextBox>())                    

oder aber

C#-Quelltext
1:
List<RichTextBox> rtbList = new List(Controls.OfType<RichTextBox>());                    


PS: using System.Linq nicht vergessen...

PPS: Nicht um hier zu protzen, sondern nur, um dir zu zeigen, wie einfach manchmal Linq sein kann, auch für IsModified eine kurze Linq-Alternative:

C#-Quelltext
1:
rtbList.Any(rtb => rtb.Modified);                    

Die Erklärung zu dem Ausdruck innerhalb der Klammer findet sich unter Lambda-Ausdrücke [https://msdn.microsoft.com/de-de/library/bb397687.aspx].
Spiel am besten mal mit einigen der Enumerable-Methoden [https://msdn.microsoft.com/de-de/library/system.linq.enumerable_methods%28v=vs.110%29.aspx] herum...


Delete - Di 15.09.15 09:10

- Nachträglich durch die Entwickler-Ecke gelöscht -