El tudnátok nekem nagyon egyszerűen magyarázni részletesen, hogy ez pontosan mit jelent, mit csinál? Button btn = (Button) sender;
Button típusra castolja az eseménykezelő függvény sender objektumát.
Ha nagyon kezdő vagy, akkor elég sok olyan fogalom van, amit nem érthetsz ebből, dehát nem véletlenül konzol alkalmazásokkal szokás kezdeni a tanulást és nem grafikus dolgokkal.
Akkor tegyük fel, hogy van valami ilyened:
Float elso = 3.0;
Int masodik = (int) elso;
Ugye az első sor létrehoz egy float típusú változót, aminek az értéke pont 3. A második sor létrehoz egy integer változót, aminek az elso értékét (tehát 3-at adja). Ugye ez így egyszerű: lebegőpontos (tehát az értéke lehet nem egész is) értéket átrak egy olyan változóba, ami csak egész számot tud tárolni. A számítógépnek viszont ez nem mindig egyértelmű, ezért zárójelben megsúgja, hogy igen, ez az érték egész szám.
Na pont ugyanezt csinálja a fenti sor is. A sender változó eredetileg nem Button típusú, ezért zárójelben megmondod a gépnek, hogy de ez egy Button.
Kb ennyi, remélem érthető.
Na akkor leírom , hogy miket tanulj meg hogy nagyjából megértsd ezt normálisan:
Mi az osztály (egységbezárás)?
Mi az a tagváltozó/tagfüggvény?
Mi az öröklés, poliformizmus?
Mi C#-ban az "object" (osztály)?
Mi az objektum?
Mi az a objektumreferencia?
Mi az a függvényreferencia (delegált)?
Mi az az esemény (event)?
Mi a különbség az érték és a referenciatípus között?
Mi az a Boxing/Unboxing?
Ezekre a kérdésekre is érdemes keresned a választ.
Hajrá!
Miért van minden válasz eléggé lepontozva?
Rákattintottam a kérdésre, hogy én is tanuljak belőle, meg kell mondjam, még hasznos is volt számomra. Miért vannak lepontozva?
Nagyon nagyon szépen köszönöm még egyszer a segítséget! ;)
utolsó válaszoló: én se értem miért van lepontozva, aki lepontozta... azhülye:D mert nagyon érthetően lett elmagyarázva.
Ennek akkor van igazán jelentősége, ha több gombhoz ugyanaz az eseménykezelő van hozzárendelve. Például a programodban kóddal generálsz gombokat, mondjuk így, WinForms alatt:
for (int i = 0; i < 10; i++) {
.. Button b = new Button() {
.. .. Tag = i;
.. .. //beállítod még a Top, Left, Width, Height property-ket is
.. };
.. b.Click += this.GeneratedButtonClicked;
}
És van egy EventHandler delegate-nek megfelelő metódusod:
private void GeneratedButtonClicked(object sender, EventArgs e) {...}
Az EventHandler egy kétparaméteres, void visszatérési értékű metódust ír le, melynek paraméterei
- sender: megadja, hogy melyik objektumon váltódott ki a kivétel (jelen esetben melyik gombra kattintottak)
- e: további információkat ad az eseményről - ez most nekünk nem érdekes.
Mint láthatod, a sender típusa object, amivel túl sok mindent nem tudunk kezdeni. Valamikor az ősidőkben ez azért lett így kitalálva, hogy az EventHandler delegate újrahasznosítható legyen, csak akkor még nem léteztek a generikusok sem nagyon, így az egyetlen megoldás az volt, hogy object-ként adják tovább a referenciát, amin az esemény történt, aztán kódon belül majd cast-olással visszanyerjük az eredeti típust - elvégre fejlesztőként úgyis tudjuk, milyen típusok jöhetnek szóba, hiszen mi írjuk a kódot. Valahogy így:
Button senderButton = null;
try {
.. senderButton = (Button)sender;
}
catch (InvalidCastException) {
.. return;
}
//kezeled az eseményt
vagy így:
Button senderButton = sender as button;
if (senderButton == null) return;
//kezeled az eseményt
vagy C# 6 óta így:
if (sender is Button senderButton) {
.. //kezeled az eseményt
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!