Autor Beitrag
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 14.09.15 12:24 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 14.09.15 16:44 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 14.09.15 17:19 
Der Sinn von EventHandler (und dessen generische Variante EventHandler<TEventArgs>) 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
ausblenden 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:
ausblenden C#-Quelltext
1:
MyEvent(this, EventArgs.Empty);					
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 15.09.15 05:52 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 (d.h. als Erweiterungsmethode) ;-)

Die Anwendung wäre dann z.B.
ausblenden C#-Quelltext
1:
foreach (RichTextBox rtb in Controls.OfType<RichTextBox>())					

oder aber
ausblenden 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:
ausblenden C#-Quelltext
1:
rtbList.Any(rtb => rtb.Modified);					

Die Erklärung zu dem Ausdruck innerhalb der Klammer findet sich unter Lambda-Ausdrücke.
Spiel am besten mal mit einigen der Enumerable-Methoden herum...
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 15.09.15 09:10 
- Nachträglich durch die Entwickler-Ecke gelöscht -