ممنون خیلی جالب بود
ولی 2 تا سوال برام پیش اومد اولی رو تو این پست مینویسم و دومی رو زیر همین پست.
سوال اول
طبق روش اولی که گفتید، اگه بخوام کاری کنم که یکی از event های این Custom Control رو تغییر بدم مثلا کاری کنم که با تغییر رخداد CheckedChanged یه MessageBox ظاهر بشه باید چیکارکنم؟
آخه تو روشی دومی که شما گفتی، یه radioButton داریم که داخل UserControl1.Designer.cs میتونیم بنویسیم
[LTR]
کد:
this.radioButton1.CheckedChanged +=
new System.EventHandler(this.radioButton1_CheckedChanged);
[/LTR]
اما تو روش اول دیگه radioButton1 رو نداریم. پس چه جوری میشه به رویداد CheckedChanged این CustomControl یه سری دستورات اضافه کرد، که دیگه برای هر شیئ ای که از این CustomControl به فرم اصلی اضافه میکنم ، کد تکراری ننویسم.
.
خیلی ساده است، کلاس شما وارث کلاس RadioButton است، پس می توانید رخداد CheckedChanged را
override کنید، از طریق متد OnCheckedChanged که مسئول رخداد CheckedChanged است :
کد:
protected override void OnCheckedChanged(EventArgs e)
{
base.OnCheckedChanged(e);
MessageBox.Show(string.Format("{0} : Checked Changed to {1}!", Name, Checked));
}
اون کد (base.OnCheckedChanged(e برای اینه که متد اصلی همانطور که هست فراخوانی بشه، یعنی ما
قصد ناقص کردن روال عادی رخداد رو نداریم، فقط می خواهیم چیزی بهش اضافه کنیم.
سوال دوم
اول بگم که هنوز روش دوم رو امتحان نکردم.
در مورد
parent و کد زیر یکمی توضیح میدید، می خوام بدونم چرا ctl بلافاصله بعد از پرانتز قرار گرفته، آخه تا حالا اینجور کدی ندیده بودم. نکنه همون تبدیل ضمنی هست.
کد:
((RadioButton)ctl).Checked = false;
البته اگه جوابش کوتاه باشه ممنون میشم توضیح بدید ولی اگه جوابش زیاده بیخیالش،
نمی خوام اذیت بشید
.
هر کنترل ای که روی فرم قرار می دهید یک والد (Parent) داره که اون والد کلاسی است که کنترل درون اون
جا گرفته. والد بودن یکسری ویژگی داره، مثلا یکی از ویژگی های Parent اینه که اگه جابجا بشه کنترل های فرزند
هم جابجا می شوند و یا اگه Enabled اش False بشه، فرزند هایش هم غیر فعال می شوند و ...
اگر یک کنترل را روی خود فرم قرار بدید، Parent اش خود فرم ئه، اما اگه داخل یک GroupBox یا Panel و سایر
کنترل های مشابه قرار بدهید، Parent اش اون کنترل خواهد بود، نه فرم.
تبدیل ضمنی نیست، تبدیل صریحه. تبدیل ضمنی یعنی بدون اینکه لازم باشه نوع داده مقصد رو مشخص کنیم خود
کامپایلر برای تبدیل نوع اقدام کنه. اینکار هم میسر نیست مگر اینکه کامپایلر دقیقا بتونه تشخیص بده که نوع داده
مقصد چیه. اگر ما فقط بنویسیم ctl.Checked = false کامپایلر نمی تونه تشخیص بده که Checked متعلق به کدوم
کلاس است، فقط می دونه که کلاس Control همچین مشخصه ای نداره و خطا میده.
از اونجایی که کامپایلر نمی تونه بفهمه که ما می خواهیم با ctl که یک Control است به عنوان یک RadioButton
رفتار کنیم، لازمه که دقیقا بهش بفهمونیم که از دید ما ctl یک RadioButton است. کد بالا رو میشه اینطوری هم
نوشت :
کد:
RadioButton opt = (RadioButton)ctl;
opt.Checked = false;