برای انجام اینکار توسط ایونت باید سه مرحله انجام بدیم:
1. تعریف Delegate
2. تعریف ایونت بر اساس اون دلیگیت
3. فراخوانی ایونت
خب برای مرحله اول لازمه که توی فرم جستجو (کلاس پابلیشر یا انتشاردهنده) همسطح کلاس، یه delegate با signature زیر تعریف کنیم:public delegate void SearchEventHandler(object sender, EventArgs args);
پس ایونتی که استفاده میکنیم باید از این signature تبعیت کنه، یعنی ریترن تایپش void باشه، دوتا پارامتر بگیره، اولی از جنس ابجکت و مشخص کننده کلاسیه که این ایونت رو ازش فراخونی میکنیم، دومین پارامتر از جنس کلاس EventArgs که شامل دیتا و اطلاعاتی میشه که لازم داریم (شما باید یه کلاس کاستوم برای eventargs بنویسین که اون اطلاعاتی که لازم دارین رو در خودش داشته باشه، در ادامه این رو هم توضیح میدم)
حالا میایم داخل بدنه کلاس فرم جستجو یه نمونه ایونت از این دلیگیت میسازیم، بشکل زیر:
public event SearchEventHandler ItemSelected;
مرخله دوم هم تموم شد.
حالا میرسیم به مرحله سوم، برای فراخوانی ایونت، باید یه متد تعریف کنیم که مسئول فراخوانی ایونت هستش، پس یه متد با signature زیر تعریف میکنیم:
protected virtual void OnItemSelected(EventArgs args)
{
if(ItemSelected != null)
{
ItemSelected(this, args);
}
}
توضیح متد بالا اینه که اگر اون ایونتی که تعریف کردیم دنبال کننده ای داشته باشه (یعنی توی کلاس یا فرم دیگه ای این ایونت رو فراخوانی کرده باشیم یا اصطلاحا ایونتمون فایر(fire) شده باشه) مخالف null میشه و داخل بدنه if اون رو دقیقا مثل یک متد معمولی فراخوانی میکنیم تا دنبال کننده ها رو از این ایونت باخبر کنیم، اما باید از اون signature که برای دلیگیت تعریف کردیم تبعیت کنه، پس پارامتر اول میشه کلاسی که ایونت رو فایر میکنه یعنی کلاس جاری (فرم جستجو)، پارامتر دوم هم شامل اطلاعات موردنیازمون هستش.
اگر ایونتمون دنبال کننده ای نداشته باشه، ایونت برابر null خواهد بود.
حالا متد OnItemSelected رو داخل رویداد دابل کلیک دیتاگرید ویو به این شکل فراخوانی میکنیم و اطلاعاتی که لازم داریم رو از طریق ابجکت args به متد OnItemSelected پاس میدیم
OnItemSelected(new EventArgs { AccountNumber = Convert.ToString(dataGridViewX1.CurrentRow.Cells["shhesab"].Value), AccountOwner = // get the Account Owner });
الان ما به فرم جستجومون (که ایونت رو داخل اون تعریف کردیم) publisher یا انتشاردهنده میگیم و میتونیم از این ایونت توی هر فرمی که لازم باشه به راحتی استفاده کنیم، نحوه استفاده از این ایونت به شکل زیره، فرضا توی فرم 1 هستیم و لازم داریم که فرم جستجو رو باز کنیم و از ایتمی که توی فرم جستجو انتخاب میشه استفاده کنیم:
var searchingForm = new frmSearchingForm();
searchingForm.ItemSelected += frmSearchingForm_ItemSelected;
private void frmSearchingForm_ItemSelected(object sender, EventArgs args)
{
// now your data is stored in args
}
توی کد بالا به ایونت هندلر frmSearchingForm_ItemSelected که توی فرم 1 داره ایونت ItemSelected توی فرم جستجو رو فراخوانی میکنه میگیم subscriber یا دنبال کننده اون ایونت (به تبع اون به کلاس فرم 1 هم دنبال کننده میگیم)
کار تمومه.
اما حالا درمورد اون کلاس custom eventargs که گفتم، باید یه کلاس تعریف کنید که از کلاس EventArgs ارث بری میکنه، و براش پراپرتی هایی که لازم دارین رو تعریف کنین:
public class SearchEventArgs:EventArgs
{
public string AccountNumber {get; set;}
public string AccountOwner {get; set;}
}
و برای استفاده از این کلاس باید توی کد های بالا، به جای تمامی EventArgs ها از کلاس SearchEventArgs استفاده کنید.
نکته دیگه اینکه شما به جای تعریف یک دلیگیت میتونین از دلیگیت تعریف شده توی خود دات نت استفاده کنین، پس مرحله اول حذف میشه و فقط از مرحله دوم کار رو شروع میکنین، یکی از این دلیگیت های پیش فرض دلیگیت EventHandler هستش که باید از نوع جنریکش استفاده کنید و نوع SearchEventArgs رو بهش بدین، به این صورت:
public event EventHandler<SearchEventArgs> ItemSelected;
اگر از دلیگیت پیشفرض خود دات نت استفاده کنین، میتونین اون دلیگیتی که خودمون تعریف کردیم رو پاک کنین و مستقیما ایونت رو بسازین
اگر بازم مشکلی داشتین بگین راهنمایی کنم