Visual C# — Obiekt sender i jego używanie w praktyce.

Visual C# — Obiekt sender i jego używanie w praktyce.
Razem głosów: 24 co stanowi: 96.67% całości.

 

 

imgres

 

Często podczas pisania kodu w C#  zwłaszcza bazując na  Formularzach Windows po utworzeniu obiektu w kodzie spotykamy kawałek np takiego kodu :

Oczywiście wszyscy wiemy, ze jest to po prostu zdarzenie Click dla naszego przycisku umieszczonego na formularzu, a czym jest i jak używać tajemniczego  object sender ??

hmm…  W sumie niema tu nic tajemniczego , ów dziwaczny sender   stanowi obiekt wywołujący  zdarzenie. Co to znaczy ??

W uproszczeniu sender przekazuje informację o tym jaki obiekt jest nadawcą komunikatu / funkcji …. co dla nas oznacza, że nasz kod zamiast zawierać wiele powtórzeń tego samego kodu , może zostać uproszczony do jednej funkcji która sprawdzi kto jest senderem  i na  podstawie tejże informacji wywołać odpowiedni kod :) No fakt ładnie w teorii ale jak się ma to do praktyki ??

W praktyce korzystanie z sendera jest bardzo proste  i co lepsze pozwala nam stworzyć o wiele estetyczniejszy kod .   No to co przydałby się jakiś  prosty przykład dla zobrazowania …   no dobrze na początek  może coś prostego …


 

..:: Przykład 1 …. prostota jest istotna …


 

Załóżmy że budujemy aplikację zawierającą wiele Butonów :

Przechwytywanie

Od tej strony wszystko wygląda fajnie prawda ?? ale od strony kodu…  klikniecie na formularzu w przycisk zdefiniuje nam metodę onClick dla przycisku  w którym to wywołujemy naszą funkcję ….  wygląda to następująco:

Zatem powiedzmy, że każdy nasz przycisk ma wyświetlać  wiadomość  w  formie MessagesBoxa zawierającą nazwę przycisku..

tak wiem że to trochę banalny przykład , ale będzie prościej przedstawić istotę uproszczenia kodu jaki nam daje własnie sender...   popatrzcie teraz sami w celu wywołania metody:

MessageBox.Show()   dla każdego butona musimy operację powtórzyć   co w kodzie raz ze wygląda mało estetycznie to jeszcze burzy jego przejrzystość:

Owszem przy kilku przyciskach jest to jeszcze do zaakceptowania , ale przy 10 , 20 i wiecej ??

no masakra ….. metody się mnożą i nie widać końca całość podczas przeglądania kodu zaczyna być kłopotliwa i mało praktyczna. Dlatego własnie tu  przychodzi nam z pomocą  obiekt sender ….

— jak ??  —-   już tłumaczę :)

Dzięki obiektowi sender , możemy zastąpić wszystkie te funkcje jedną, która używa właśnie sendera.  Popatrzcie ..  utworzymy sobie metodę Przycisk_Klik()  i  podłączymy ją do naszych przycisków co jest banalnie proste :) nasza metoda przyjmie postać kodu:

jest jak widać bardzo prosta … i działa następująco: Jeśli klikniemy na dowolny przycisk to zostanie wywołana nasza Funkcja  Przycisk_Klik()  która  wyświetli MessageBoxa z nazwą Przycisku pobraną z sendera:)  — nie wierzycie ??

sprawdźcie sami :)

Podpięcie naszej funkcji robimy tak :P

Przechwytywanie1

Nasz kod tymczasem wygląda już tak :

i co ważniejsze działa zgodnie z naszym oczekiwaniem:

Przechwytywanie3

 

Co tu zaszło ??   To proste zamiast podawać w parametrze Show obiektu MessageBox nazwy Przycisku zrobiliśmy proste rzutowanie sendera na obiekt typu button dzięki czemu wyświetliliśmy sobie nazwę obiektu wywołującego MessageBox.

Oczywiście można to zrealizować na wiele sposobów i korzystając z obiektu sender możemy uzyskać wiele …    gdyż po rzutowaniu otrzymujemy w obiekcie   nasz obiekt wywołujący zdarzenie i możemy się odwołać do jego dowolnej metody np jeśli zmienimy naszą funkcję na :

to zgodnie z tym co napisałem wyżej .. możemy np zmienić nazwę obiektu wywołującego w taki sposób:

Prawda że użyteczne ??

Dobrze czasem wiedzieć jakie własności przyjmują obiekty typu Windows.Form.Controls …  np obiekt tag pozwala zapisać obiekt co może nam się przydać do dowolnego wykorzystania w naszym programie. A użyteczne jest właśnie z wykorzystaniem obiektu sendera.  Dzięki czemu z sendera możemy odczytać tag i użyć go w metodzie obsługiwanej przez sender:)

W tagu możemy mieć dowolne informacje i to jest właśnie piękne,  dlatego ta pomijana często przez początkujących możliwość wykorzystania obiektu sendera jest warta wspomnienia i używania gdyż pozwala znacznie ułatwić i skrócić kod. Oczywiście przykład z przyciskami jest banalny i nic nie wnoszący, ale może się przydać do wielu rzeczy np pomocna przy obsłudze DataGridView  ….


 

..::  Przykład 2 …  bardziej wyrafinowany … 


 

Gdy korzystamy z TabControl  i w każdej karcie Taba mamy kilka kontrolek DataGridView  to z pewnością chcemy po załadowaniu wierszy  danych mieć je ładnie ponumerowane prawda ?? Oczywiście … tak wszyscy używacie DataBindingComplete, zdarzenie to przecież prosto dokonuje numeracji … to prawda..  ale  , no właśnie tylko na pierwszy rzut oka się tak wydaje … jest to sprawa oczywista w przypadku jednej kontrolki DataGridView a jak jest ich więcej zawierających różne dane ??   No tak … przecież wystarczy do każdej kontrolki podpiąć kod obsługujący zdarzenie DataBindingComplete … super tylko że … mało elegancko mamy powtarzający się kod i całość wygląda nieestetycznie i mało czytelnie :(   Jak to poprawić ??  to proste :)  użyjmy Object sender

Oczywiście nie będę tu już się rozpisywał jak co od początku bo chyba każdy już wie w każdym razie cała nasza praca polega na poprawieniu obsługi zdarzenia DataBindingComplete na  jednej z naszych kontrolek DataGridView co może wyglądać np tak:

Prawda że proste ??

— teraz wystarczy przypisać naszą metodę dla zdarzenia DataBindingCompletd do pozostałych kontrolek DataGridView  i mamy ładnie numerowane wiersze na wszystkich kartach TabControl.

Pamiętacie jak to działa ??

 

Rzutujemy sobie obiekt sender na obiekt będący kontrolką DataGridView –> sender as DataGridView  co powoduje, że uzyskujemy dostęp do wszystkich właściwości kontrolki i korzystając z tej przydatnej przypadłości  numerujemy sobie wszystkie wiersze …., a tym samym nie musimy powtarzać kodu :)

Mam nadzieje że po eksperymentujecie sobie z obiektem sender , mały jest on i niezauważalny , ale możliwości daje wielkie ..

Więcej znajdziecie w MSDN polecam …

 

 

Podziel się na:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay