PDA

View Full Version : قرار دادن کنترل در toolstrip



emad_67
سه شنبه 03 مهر 1386, 23:01 عصر
سلام خدمت دوستان عزیز
آیا میشه کنترل هایی مثل checkBox و NumericUpDown که در کنترل های مربوط به toolstrip قرار ندارن رو به toolstrip اضافه کرد؟

PC2st
چهارشنبه 04 مهر 1386, 00:47 صبح
کنترلهای معمولی CheckBox و NumericUpDown رو نمیشه قرار داد ولی هر کلاسی که از کلاس ToolStripItem به ارث رسیده باشه، میتونه بعنوان یک کنترل در آیتمهای ToolStrip قرار بگیره، کلاس زیر این کار رو انجام داده و میتونید توسط متد ToolStrip.Items.Add یک نمونه شیئ از کلاس زیر رو به ToolStrip اضافه کنید که یک ککنترل CheckBox رو به اون اضافه میکنه:


class ToolStripCheckBox : System.Windows.Forms.ToolStripControlHost
{
public ToolStripCheckBox() : base(new System.Windows.Forms.CheckBox()) { }

public CheckBox ToolStripCheckBoxControl
{
get
{
return Control as CheckBox;
}
}
//expose checkbox.enabled as property
public bool ToolStripCheckBoxEnabled
{
get
{
return ToolStripCheckBoxControl.Enabled;
}
set
{
ToolStripCheckBoxControl.Enabled = value;
}
}
protected override void OnSubscribeControlEvents(Control c)
{
// Call the base method so the basic events are unsubscribed.
base.OnSubscribeControlEvents(c);

CheckBox ToolStripCheckBoxControl = (CheckBox)c;
// Remove the event.
//ToolStripCheckBoxControl.CheckedChanged += new EventHandler(CheckedChanged);
}
protected override void OnUnsubscribeControlEvents(Control c)
{
// Call the base method so the basic events are unsubscribed.
base.OnUnsubscribeControlEvents(c);

CheckBox ToolStripCheckBoxControl = (CheckBox)c;
// Remove the event.
//ToolStripCheckBoxControl.CheckedChanged -= new EventHandler(CheckedChanged);
}
public event EventHandler CheckedChanged;
private void OnCheckChanged(object sender, DateRangeEventArgs e)
{
if(CheckedChanged != null)
{
CheckedChanged(this, e);
}
}
}

کدها از منبع زیر گرفته شده اند: http://www.xtremedotnettalk.com/showthread.php?t=100015
فقط نکته اینکه: بخاطر Test کدها، دو خط از کدهای منبع رو بصورت comment در آوردم چون ارور داشت.

emad_67
چهارشنبه 04 مهر 1386, 12:22 عصر
سلام
خیلی ممنون از جوابی که دادین
من دوتا سوال در رابطه با این کد برام پیش اومد
در مورد این خط اگه لطف کنید توضیحی بدید ممنون میشم


return Control asCheckBox;

سوال دوم اینه که متد های
OnUnsubscribeControlEvents و
OnSubscribeControlEvents
که override شدن برای چی هستند و چیکار میکنن؟

PC2st
چهارشنبه 04 مهر 1386, 16:45 عصر
این خط مثل تبدیل نوع عمل میکنه، یعنی خط فوق معادل خط زیر حساب میشه:


return (CheckBox)Control;


متدهایی که گفتید هم برای مشخص کردن رویدادهای کنترل اضافه شده بکار میره.

emad_67
چهارشنبه 04 مهر 1386, 17:03 عصر
با تشکر
این خاصیت control از فرم همون شی ایی رو برمیگردونه به به متد سازنده کلاس base فرستادیم؟
یه سوال دیگه هم که برام پیش اومد اینه که :


public event EventHandler CheckedChanged;
private void OnCheckChanged(object sender, DateRangeEventArgs e)
{
if(CheckedChanged != null)
{
CheckedChanged(this, e);
}
}

در اینجا یه رویداد تعریف کردیم. حالا اگه من تابعی در این رویداد قرار بدم این رویداد چه جوری میخواد فراخوانی بشه.چون تابعی هم که اونو فراخوانی کرده هیچ جایی فراخوانی نشده و به خاطر peivate بودن، کاربر هم نمیتونه اونو فراخوانی کنه. میخواستم ببینم برا چی تعریف شده؟

PC2st
چهارشنبه 04 مهر 1386, 21:24 عصر
آره، خاصیت Control ارجاع به همان شیئ CheckBox ای است که مورد استفاده قرار میدیم.

در مورد رویداد، باید بگم که رویداد رو کاربر فراخوانی نمیکنه و وظیفه کلاس هست که کاربر رو از رخ دادن رویداد آگاه کنه، در کلاسی که اینجا تعریف شده، هر جا که کلاس بخواد رخ دادن یک رویداد رو به کاربر اطلاع بده، میتونه متد OnCheckChanged رو صدا بزنه. البته اگر این کلاس بخواد به رویداد Check شدنه ComboBox پاسخ بده، باید کلاس رو تغییر داد که اون متدهایی که لازمه تغییر بدی رو این زیر مینویسم:


protected override void OnSubscribeControlEvents(Control c)
{
// Call the base method so the basic events are unsubscribed.
base.OnSubscribeControlEvents(c);
CheckBox ToolStripCheckBoxControl = (CheckBox)c;
// Remove the event.
ToolStripCheckBoxControl.CheckedChanged += new EventHandler(OnCheckChanged);
}
protected override void OnUnsubscribeControlEvents(Control c)
{
// Call the base method so the basic events are unsubscribed.
base.OnUnsubscribeControlEvents(c);
CheckBox ToolStripCheckBoxControl = (CheckBox)c;
// Remove the event.
ToolStripCheckBoxControl.CheckedChanged -= new EventHandler(OnCheckChanged);
}
void OnCheckChanged(object sender, EventArgs e)
{
if(CheckedChanged != null)
{
CheckedChanged(this, e);
}
}

متدهای فوق، متدهاییست که باید تغییر پیدا کنه، برای استفاده از کلاس:


ToolStripCheckBox chck = new ToolStripCheckBox();
chck.CheckedChanged += new EventHandler(chck_CheckedChanged);
toolStrip1.Items.Add(chck);

که:


void chck_CheckedChanged(object sender, EventArgs e)
{
Console.Beep();
}