אירועים

מה זה Event? במקרה שלנו זו הודעה שנשלחת לאיזו פונקציה כתוצאה מפעולה אחרת שנתבצעה. כמו שלחיצה על לחצן בדרך כלל גוררת אחריה תגובה, כך גם כאן. אנו יוצרים מחלקה שיש לה אירועים, כמו מחלקת לחצן שיש לה מאורע של לחיצה. אז אני יוצר את המחלקה הזאת, ומוסיף לה Handler לאירוע הספציפי שאני רוצה - בדומה למה שאנו עושים עם לחצן- אנו מודיעים לו לאיזה פונקציה לקרוא אם מישהו ילחץ עליו. ניצמד לדוגמה של הלחצן להבנת העניין...

בואו נגדיר מחלקה:

MyClass

למחלקה שלנו יש מאורע שנקרא, שדומה לאירוע Click של כל לחצן טיפוסי

public delegate void MyClickEventHandler( object sender, MyClickEventArgs e);

והיא גם יודעת לטפל במאורע הזה(זה לא חובה, אבל זה ישמש אותנו כדי להפיק תועלת מכל הדבר הזה...)

public event MyClickEventHandler MyClickEvent;

שימו לב שהמאורע שלנו מקבל נתונים מסוימים- אנו רוצים לדעת פרטים על המאורע ולא רק שהוא קרה. אם אני לא צריך נתונים נוספים ניתן לוותר עליהם, אבל אני כן צריך, אז שימו לב שאני יוצר מחלקה נוספת מיוחדת שתכיל את האירועים האלה , והמחלקה הזאת יורשת מהמחלקה EventArgs שכולנו מכירים מכל מיני אירועים נוספים בדוט נט. אם ניקח לדוגמה את הלחצן, אזי המחלקה הזאת יכולה להכיל את הנקודה המדויקת שבה נלחץ הלחצן:

public class MyClickEventArgs : EventArgs
{
    private string _data1;
    private string _data2;
    public MyClickEventArgs( string data1, string data2)
    {
        this._data1 = data1;
        this._data2 = data2;
    }
    public stringData1
    {
        get{ return this._data1; }
    }
    public stringData2
    {
        get{ return this._data2; }
    }
}

טוב, אז יש לי מחלקה, ויש לה אירוע מסויים. איך משתמשים בזה? במחלקה אחרת לגמרי ניתן ליצור מופע של המחלקה שלנו, בדיוק כמו להוסיף לחצן חדש:

MyClass mc = new MyClass ();

כעת יש 2 דרכים להפעיל את האירוע- או ישירות לקרוא לאירוע וליצור פונקציה שתגיב עליו (שזה קצת חסר טעם...) או להפעיל אותו ישירות דרך המחלקה שלו, ושוב עלינו להגיד למחלקה שלו מה אנחנו רוצים לעשות במקרה והאירוע אכן יקרה(לדוגמה אם מישהו אחר יפעיל אותו): א. בדרך הישירה (שניתן לוותר עליה לגמרי ולעבור לדרך השניה...) - אני יוצר מופע של נתוני המאורע(שוב, זה לא חובה)

MyClickEventArgs mea = new MyClickEventArgs("shalom" , "lekulam" );

מגדיר פונקציה שהפרמטרים שלה מתאימים למאורע שאנו יוצרים:

void mc_MyClickEvent (object sender, MyClickEventArgs e)
{
    MessageBox.Show(e.Data2, e.Data1);
}

מקשרים בין הפונקציה למאורע

MyClass.MyClickEventHandler handler = new MyClass.MyClickEventHandler (mc_MyClickEvent);

ופשוט מפעילים את המאורע, שבתגובה יפנה לפונקציה שהגדרנו לו

handler.Invoke(this ,mea);

ב. דרך המחלקה שלו - כעת אנו צריכים במחלקה עצמה ליצור פונקציה שניתן יהיה לקרוא לה מבחוץ ותפעיל את המאורע, ואז בכל מקום שיצרתי מופע מהמחלקה הזו אני אומר לה איזו פונקציה להריץ במקרה והמאורע הזה קורה, לא משנה מי הפעיל אותו ומאיפה. קודם ניצור פונקציה במחלקה עצמה והיא תשמש את כולם כדי להפעיל את המאורע דרך המחלקה עצמה, אם ניקח לדוגמא את הלחצן, אז זו פונקציה פנימית שאנו לא רואים ומופעלת ברגע שהעכבר לוחץ עליו:

public void TriggerClick(string data1,string data2)
{
     MyClickEvent.Invoke(this, new MyClickEventArgs(data1, data2));
}

כעת בכל מקום שיצרתי מופע מהמחלקה אני מגדיר שאם יקרה המאורע במחלקה אז לקרוא לאיזו פונקציה שאני אבקש, זה דומה להגדרת לחצן בדף, והוספת פונקציה שתטפל בקליק עליו(בדרך כלל נעשה מאחורי הקלעים בשבילנו...)

MyClass mc = new MyClass();
mc.MyClickEvent += new MyClass.MyClickEventHandler(mc_MyClickEvent);

וכמובן אני צריך לבנות את הפונקציה שאליה יקרה המאורע:

void mc_MyClickEvent(object sender, MyClickEventArgs e)
{
    MessageBox.Show(e.Data2, e.Data1);
}

זהו... נראה קצת מבלבל למי שרואה פעם ראשונה, אבל אחרי פעם פעמיים זה ממש פשוט... להורדת הפרוייקט

טוען נתונים...
אהבתם?
המליצו לאחרים!

נהניתם? בעיות? הערות?
אני רוצה לשמוע!
rss feed