Leniwce.com | blog technologiczny
Sender - co to za obiekt
Bartosz Lewandowski, 2009-04-23 23:44:05
kategoria: C#

Jestem zwolennikiem upraszczania kodu programu. Bardzo nie lubię redundantności w programowaniu. Po to są procedury i funkcje, obiekty i metody aby powtarzalne fragmenty kodu w nie zamykać i przez to właśnie go upraszczać. I warto pamiętać o obiekcie sender, który przekazuje do funkcji informacje jaki obiekt jest nadawcą komunikatu. Dzięki temu jedna, uniwersalna funkcja zapewni obsługę wielu zdarzeń dla naszych obiektów.

Jak wykorzystać obiekt sender?
Ja wspomniałem, sender zawiera informacje o obiekcie nadawcy. Zamiast wywoływać ten sam kod kilka razy można sprawdzić jaki obiekt wywołał naszą funkcję (czyli kto jest senderem) i na tej podstawie wywołać odpowiedni kod. Ja pokażę na przykładzie kilku obiektów typu button i będę rozpoznawać, jaki przycisk został naciśnięty.

Tworzę więc formę:

Przy standardowym wywołaniu na zdarzenie onClick, w celu wyświetlenia przycisku wyświetlającego na onClick nazwię przycisku można podpiąć metodę:

private void button1_Click(object sender, EventArgs e)
{
  MessageBox.Show("button1");
}

Identycznie muszę postąpić z pozostałymi obiektami, więc cały kod wygląda już tak:
private void button1_Click(object sender, EventArgs e)
{
  MessageBox.Show("button1");
}
 
private void button2_Click(object sender, EventArgs e)
{
  MessageBox.Show("button2");
}
 
private void button3_Click(object sender, EventArgs e)
{
  MessageBox.Show("button3");
}

Gdybyśmy mieli tych butonów więcej, okazałoby się, że takie dodawanie kolejnych metod jest już kłopotliwe i mało praktyczne. Więc zastąpmy te funkcję jedną, wykorzystującą obiekt sender. Metoda ta nazywać się będzie allButtons_click i przypnę ją do wszystkich obiektów typu button:



Postać metody allButtons_click:

private void allButtons_Click(object sender, EventArgs e)
{
    MessageBox.Show((sender as Button).Name.ToString());
}

Jak widać, zamiast podawać w parametrze metody Show obiektu MessageBox nazwy buttona, wystarczyło rzutować obiekt sender na obiekt typu button i wyświetlic nazwę obiektu. Bardziej widoczne to będzie przy zapisie w postaci:

private void allButtons_Click(object sender, EventArgs e)
{
    Button btn = (sender as Button);
    MessageBox.Show(btn.Name.ToString());    
}

W tym przykładzie widać doskonale, że po rzutowniu otrzymujemy w obiekcie btn obiekt wywołujący. I możemy odwoływać się do jego dowolnej metody, więc nic nie stoi na przeszkodzie aby zmienić nazwię obiektu wywołującego:
 btn.Text="clicked";

Warto tu wspominieć o własności tag obiektów typu Windows.Form.Controls, w którym możemy zapisać obiekt w celu dowolnego wykorzystania w naszym programie. I własność ta może być przydantna własnie z wykorzystaniem obiektu sender. Możemy z sendera odczytać obiekt tag i wykorzystać w metodzie obsługiwanej przez sendera:
private void allButtons_Click(object sender, EventArgs e)
{
    Button btn = (sender as Button);
    MessageBox.Show(btn.Tag.ToString());    
}

Co zapiszemy w tagu – to już zależy od inwencji autora.

Podsumowując, ta często pomijana możliwość wykorzystania sendra znacznie ułatwia i skraca tworzony przez nas kod. Warto więc o niej pamiętać i ją wykorzystować. Ja często ją wykorzytuje przy słownikach, gdzie wywołuje formę prezentująca dane słownikowe a tabelę i pola zapisuje w obiekcie Tag. Dzięki temu jedna metoda obługuje wszystkie słowniki w programie.

Powiązane artykuły
Atraktor Lorenza (2011-08-29)
Równoległy może więcej(?) - czyli kilka słów o Parallel.For (2011-02-06)
Święta, święta - czas pochwalić się (fraktalną) choinką (2010-12-25)
Własny wygaszacz ekranu (2010-06-03)
3.1415926535897932385... (2010-05-19)
Metody rozszerzające (2010-05-07)
GPS w lekkostrawnym sosie podany (2009-08-05)
Wszechświat na ekranie, czyli słowo o skalowaniu (2009-07-15)
OleDbConnection – Excel jako baza danych(C#) (2009-07-13)
Animacje 3D (OpenGL) (2009-07-05)


Komentarze
Brak komentarzy.

Dodaj komentarz:
Autor:*

WWW:

Treść:*

Wprowadź kod zabezpieczający*:


        * - pola wymagane
Kategorie
C# (13)
Inne (6)
Java (3)
Matlab (1)
OpenGL (1)
PHP (2)


Najnowsze wpisy

Ostatnie komentarze