PDA

View Full Version : حرفه ای: کدنویسی برای کنترل های به ارث برده شده در فرم



kouroshfar
چهارشنبه 20 دی 1391, 14:36 عصر
من یه بیس‌فرم دارم که مثلا کلیدهای جدید، ویرایش و مشاهده توی اون قرار داره. میخوام از این فرم توی فرم‌های دیگه‌م ارث‌بری کنم به‌طوری که بعد هم بتونم به رویدادها و کلا خصوصیاتش دسترسی داشته باشم. ینی درکل کار ارث‌بری من تنها در حد قرارگرفتن کنترل‌هام باشه و بعدا من بتونم خودم رویدادهام و غیره رو کنترل کنم. چیکار باید انجام بدم واسه این؟ اینکه فرم‌م بیاد از فرم اصلی‌م ارث ببره رو انجام دادم. ظاهر من و کنترل‌هام میاد ولی من دسترسی به رویدادها و غیره ندارم. درضمن Modifier رو هم پابلیک کردم


قراره توی سیستم یه سری کارهای آپدیت انجام باشه که هرکدوم کدهای خاص خودشون رو دارن ولی ظاهر اصلی کار یکیه

امیدوارم تونسته باشم قشنگ توضیح بدم.

راستی دکمه هایی که میخوام به اونها دسترسی داشته باشم روی یه Tool Strip هستن

the king
چهارشنبه 20 دی 1391, 17:02 عصر
کلاس فرمی که بقیه فرم هاتون ازش ارث بری کرده اند مثل سایر کلاس ها است، اگر قراره رخدادی داخلش اتفاق بیافته که
وارث اش با خبر بشه احتیاج به Event داره، فرضا رخداد ToolStripButton1_Click رو تعریف می کنیم :

public partial class Form1 : Form
{
public event EventHandler<EventArgs> ToolStripButton1_Click;

public Form1()
{
InitializeComponent();
}

private void toolStripButton1_Click(object sender, EventArgs e)
{
EventHandler<EventArgs> eh = ToolStripButton1_Click;
if (eh != null)
{
eh(sender, e);
}
}
}

یعنی زمانی که روی دکمه مورد نظر کلیک شد، Form1 رخداد ToolStripButton1_Click رو برای استفاده سایر کلاس ها فراخوانی می کنه.

در کلاس های وارث اگه پنجره Properties رو ببینید در بخش Events رخداد مورد نظر اضافه شده و کار می کنه :

public partial class Form2 : Form1
{
public Form2()
{
InitializeComponent();
}

private void Form2_ToolStripButton1_Click(object sender, EventArgs e)
{
MessageBox.Show("Click");
}
}

kouroshfar
چهارشنبه 20 دی 1391, 18:56 عصر
دستتووون درد نکنه.. ممنوون
یه مشکلی که هست اینه که توی فرم‌هایی که من از بِیس ارث بردم اجازه نمیده که بیام و روی دکمه‌های ToolStrip کلیک کنم (در زمان طراحی و نه اجرا) و تنها فقط میشه کل ToolStrip رو انتخاب کرد. واسه این باید چیکارکرد؟ بازم شرمنده

reza_Nazem
چهارشنبه 20 دی 1391, 19:23 عصر
سلام
توی دات نت بعضی از کنترل ها مثل ToolStrip و datagridview توی این حالت ارث بری غیر فعال می شن . علتشم سرچ کنی پیدا می کنی.
ابن دو را به ذهنم رسید
1 - کدهای لازم رو همه رو تو فرم child دستی بزنی. اگه می خوای مثلا به ToolStrip دکمه اضافه کنی توی load فرم child کدش رو بنویس
2 - یه usercontrl بساز و کنترلت رو بنداز روش . بعدش تمام خاصیت و متد ها و اونت های لازم رو باید دوباره تو userControlet بازنویسی کنی .
مثلا اگر کنترل مورد نظرت یه خاصیت به نام X داره , باید توی کنترلت یک خاصیت با نام X بسازی که همون خصوصیت کنترلت را برگردونه
بعضی خاصیت ها یک سری atribute های واجب دارند که تو هم باید در تعریف خاصیت هات بعضی از اون ها رو باید دقیقا رعایت کنی

RED-C0DE
چهارشنبه 20 دی 1391, 22:24 عصر
یکی از بهترین راه ها اینه :

فرض کنیم شما توی فرم base یک toolbar داری و یک کلید "ذخیره" . توی همین فرم بیس رویداد کلیک این کلید رو هندل کن و داخلش این رو بنویس:

// baseForm class
btnSave_Click(object sender , EventArgs e)
{
this.SaveWorks();
}

public virtual void SaveWorks()
{
// implement body in ur child forms
// throw new NotImplementedException();
// MessageBox.Show("BaseForm saving wokrs...");
}



و در هر فرمی که ارث می برین کافیه متود SaveWorks رو Override کنید و پیاده سازی خودتون رو بنویسین

// FrmChild1 class
public override void SaveWorks()
{
MessageBox.Show("ChildForm saving wokrs...");
}

Mahmoud.Afrad
چهارشنبه 20 دی 1391, 23:26 عصر
راه دیگر اینست که خاصیت Modifiers آیتم های روی toolstrip را در فرم base روی protected internal قرار بدید. حال در فرم ارث بری شده میتونید با کدنویسی رویداد را ایجاد کنید.
مثال(فرم2 از فرم1 ارث بری کرده):

public partial class Form2 : Form1
{
public Form2()
{
InitializeComponent();

this.toolStripButton1.Click += new EventHandler(toolStripButton1_Click);
}

void toolStripButton1_Click(object sender, EventArgs e)
{
MessageBox.Show("Clicked!");
}

Shahram_12
چهارشنبه 20 دی 1391, 23:29 عصر
با سلام

با توجه به اینکه موضوع این تاپیک در مورد فرم هست من هم سوالی داشتم

من فرم مخصوص خودم رو درون بک کلاس ساختم و از اون در اول برنامه استفاده کردم

حالا میخوام بدونم اگر بخوام در فرمهای دیگه هم از اون فرم استفاده کنم امکان پذیر هست؟ و چگونه؟

مرسی

Shahram_12
پنج شنبه 21 دی 1391, 14:52 عصر
از دوستان کسی کمک نمیکنه؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟

RED-C0DE
پنج شنبه 21 دی 1391, 15:23 عصر
فرمای دیگت رو از اون ارث ببر.
مشکل کار کجاس؟

public partial class FrmBaseForm:Form
{
//...
}

//--
public partial class FrmChild1 : FrmBase
{
//...
}

public partial class FrmChild2 : FrmBase
{
// ...
}

Mahmoud.Afrad
پنج شنبه 21 دی 1391, 16:03 عصر
با سلام
با توجه به اینکه موضوع این تاپیک در مورد فرم هست من هم سوالی داشتم
من فرم مخصوص خودم رو درون بک کلاس ساختم و از اون در اول برنامه استفاده کردم
حالا میخوام بدونم اگر بخوام در فرمهای دیگه هم از اون فرم استفاده کنم امکان پذیر هست؟ و چگونه؟
مرسی
کار شما ربطی به این تاپیک و ارث بری نداره. برای دسترسی به فرمهای باز ، در مورد Application.OpenForms جستجو بفرمایید.

kouroshfar
دوشنبه 25 دی 1391, 23:17 عصر
ایول. این خیلی خوبه. ممنووون