با سلام.
سئوال اولتون را نمی دونم درست متوجه شدم یا نه ولی چیزی را که فهمیدم جواب می دهم:
ببینید روال کلیک (یا باتون مثلا) فرقی از لحاظ ساختار با یک تابع که ما بسازیم نداره . ولی وقتی روی رویداد ها در پنجره پراپرتی کلیک می کنید علاوه بر ایجاد کد چند خطی برای آن که شبیه یک تابع معمولی است کد دیگری هم شکل می گیرد. به مثال زیر توجه کنید:
من در سی شارپ 2005 یک پروژه ویندوزی ساختم و یک باتون روی فرم انداختم . بعد با دابل کلیک روی باتون روال کلیک آن را می سازم که میشه این:
کد:
private void button1_Click(object sender, EventArgs e)
{
}
که می دانید هر کدی درون آن بنویسیم بعد اجرای برنامه کاربر وقتی دکمه را بزند کد درون آن اجرا میشه.
ولی حالا اگر ما خودمان این دو خط بالا را دستی بنویسیم همان کار انجام میشه؟ جواب : نه. چون این دیگه یک تابع معمولی است و به جایی وصل نیست. و باید مثل یک تابع معمولی ازش استفاده کنیم. مثلا از جایی فراخوانش کنیم.
حالا وصل شدن در کجا صورت می گیرد؟ وقتی روی ابزار در فرم دابل کلیک می کنیم یا از پنجره پراپرتی روی رویداد مورد نظر دابل کلیک می کنیم.... کدهای دیگری هم اضافه میشه.
در مثال بالا من به فایل form1.designer.cs می روم .... دارم:
کد:
//
// button1
//
this.button1.Location = new System.Drawing.Point(71, 103);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = true;
[COLOR="Red"]
this.button1.Click += new System.EventHandler(this.button1_Click);[/COLOR]
کد قرمز بالا فکر کنم داره این را می گه : داره دستور می دهد که تابع this.button1_Click ( یعنی تابعی با نام button1_Click موجود در فرم ) به لیست توابع رویداد کلیک اضافه بشه.
من برای امتحان این کد را زیر کد قرمز اضافه می کنم:
کد:
this.button1.Click += new System.EventHandler(this.my_function);
و بعد تابع خودم را زیر همان رویداد کلیک اضافه می کنم:
کد:
private void button1_Click(object sender, EventArgs e)
{
}
[COLOR="#ff0000"]
private void my_function(object sender, EventArgs e)
{
MessageBox.Show("print in my_function");[/COLOR]
[COLOR="Red"]}[/COLOR]
با اجرای برنامه بالا با کلیک بر روی فرم تابع my_function اجرا میشه و مسیج باکس داخلش اجرا میشه.
البته قبلش من این طوری هم امتحان کردم:
کد:
private void my_function()
{
MessageBox.Show("print in my_function");
}
که برنامه روی خط :
کد:
this.button1.Click += new System.EventHandler(this.my_function);
خطای زیر را می دهد:
No overload for 'my_function' matches delegate 'System.EventHandler'
که به خاطر ورودی های ناسازگاری است که رویداد کلیک انتظار ندارد.
==============
در مورد سئوال دوم : من آن رویداد را نمی شناسم و نمی دانم چه مواقعی کار می افتد.