PDA

View Full Version : انتقال دوسویه اطلاعات بین فرم مادر و فرزند



piroozman
یک شنبه 08 مهر 1386, 20:42 عصر
چه طوری می تونم فرمهای مادر و فرزند تولید کنم به طوری که به راحتی بتونم به کامپونتهای فرم فرزن(مانند تکس باکسها) از طریق فرم مادر و بالعکس (انتقال داده به صورت دوسویه) دسترسی داشته باشم و اینکه وقتی فرم فرزند را با استفاده از یک کلید از روی فرم مادر باز میکنم فرم فرزند مانع از دسترسی به فرم مادر بشه و هنگام minimizeز و maximum کردن فرم فرزند، فرم فرزند در دل فرم مادر کوچک و بزرگ بشه و فضایی از نوار وظیفه ویندوز را اشغال نکنه

hassan razavi
یک شنبه 08 مهر 1386, 22:23 عصر
مثال زیر به راحتی راه رو بهتون نشون میده
http://www.codeproject.com/csharp/mdiformstutorial.asp

Mahdi.Kiani
دوشنبه 09 مهر 1386, 00:48 صبح
با سلام دوست عزیز و با عرض تبریک به مناسبت ورود خودم به سایت و عرض تسلیت به مناسبت این ایام
یه جستجوی ساده کردم و دیدم که بار ها مسائلی از جنس نوع مسئله شما پرسیده شده و جواب هم داده شده
البته برخی جواب ها خوب و متاسفانه برخی از جواب ها نامناسب بودند




چه طوری می تونم فرمهای مادر و فرزند تولید کنم به طوری که به راحتی بتونم به کامپونتهای فرم فرزن(مانند تکس باکسها) از طریق فرم مادر و بالعکس (انتقال داده به صورت دوسویه)



دسترسی مستقیم به آبجکت های فرم های دیگه مثلا همان تکست باکسی که مثال زدین اصلا توصیه نمیشه
چون که این روش اصول شی گرایی و encapsulation را نقض میکنه و درست نیست که در زبان شی گرایی همچون سی شارپ از این روش ها استفاده بشه
پس از فکر دسترسی به آبجکت های فرم های دیگه به روشی که بعضا در مسائل دیگه هم اشاره کردند (public کردن آبجکت ها ..) بیایید بیرون
در واقع شما باید سعی کنید که داده هاتون را بین آبجکت های مختلف (کلاس ها ، فرم ها و ...) به اشتراک بذارین
یکی از بهترین روشها استفاده از property هست
با استفاده از property ها هم به هدفتون میرسین و هم قواعد شی گرایی و encapsulation را نقض نکردین
به عنوان مثال فرض کنید که 2 تا فرم دارین که روی فرم 1 یک عدد تکست باکس و یک دکمه دارین و روی فرم 2 یک عدد تکست باکس دارین
حال میخواین با زدن دکمه ای که روی فرم 1 هست فرم 2 نشون داده بشه وعلاوه بر اون متن موجود در تکست باکس 1 به تکست باکسی که روی فرم 2 هست انتقال پیدا کنه

کار هایی که باید انجام بدین
ابتدا یک property در کلاس فرم 2 به شکل زیر تعریف کنین




/// <summary>
/// Gets or Set the text of TextBox1 On Form2
/// </summary>
private string _settext;

public string SetText
{
get { return _settext; }
set { _settext = value; }
}




حالا در رویداد load مربوط به فرم 2 کد های زیر را قرار بدین





private void Form2_Load(object sender, EventArgs e)
{
this.textBox1.Text = this._settext;
}



و در رویداد کلیک مربوط به دکمه ای که در فرم یک گذاشتین کد های زیر را بذارین




private void button1_Click(object sender, EventArgs e)
{
Form2 newForm2 = new Form2();
newForm2.SetText = this.textBox1.Text;
newForm2.ShowDialog();
}



حالا برنامه را اجرا کنید
توی تکست باکس فرم 1 متن را وارد کنید و دکمه را بزنید
متن وارد شده به تکست باکس فرم 2 منتقل میشه

برای اینکه از فرم 2 هم به فرم 1 دیتا بفرستین همین روش خیلی عالیه




اینکه وقتی فرم فرزند را با استفاده از یک کلید از روی فرم مادر باز میکنم فرم فرزند مانع از دسترسی به فرم مادر بشه



برای این کار فرم فرزند را به صورت showDialog() بازش کنید (برای فرم های غیر MDI)




هنگام minimizeز و maximum کردن فرم فرزند، فرم فرزند در دل فرم مادر کوچک و بزرگ بشه



برای این کار اگه از MDI استفاده کنید همون کاری را میکنه که میخواین (برای MDI به لینکی که جناب رضوری دادن مرا جعه کنید یا جستجو در همین سایت یا google و ...)



فضایی از نوار وظیفه ویندوز را اشغال نکنه



اگه از mDI استفاده کنید این هدف هم به طور اتوماتیک براورده میشه
البته اگه خواستین فرمی را که MDIChild نشده و مستقیم نمایش داده میشه (نمایش فرم به صورت معمولی نه در دل فرم MDI parent) کافیه که خاصیت ShowInTaskbar مربوط به فرم را false کنید
اون وقت دیگه فرم در taskbar نشون داده نمیشه

امید وارم مفید بوده باشه
پ ن :
در مورد انتقال اطلاعات در بین برنامه ها بهتره از معماری MVC استفاده در این زمینه دارم یه مقاله جامع همراه با مثال کاربردی اماده میکنم که به محض اماده شدن آپ میکنم که بقیه هم استفاده کنن

alireza_tavakol
دوشنبه 09 مهر 1386, 01:02 صبح
با اینکه این مسئله برای من سوال نبوده اما رو سفیدمون کردی بابا دمت گرم انشا الله از این به بعد به سوالات من هم به همین خوبی پاسخ بدی

ARA
دوشنبه 09 مهر 1386, 10:09 صبح
با سلام دوست عزیز و با عرض تبریک به مناسبت ورود خودم به سایت و عرض تسلیت به مناسبت این ایام


من هم ورودتون رو تبریک میگم




برای اینکه از فرم 2 هم به فرم 1 دیتا بفرستین همین روش خیلی عالیه


حالا یک سوال از همه دوستان
برای اینکه ما بتونیم به property های فرم اول دسترسی داشته باشیم نیاز به یک object از فرم اول در درون فرم دوم داریم تا بتونیم به property های فرم تول دسترسی داشته باشیم

به نظر شما این راه مشکلی نداره ؟؟( در خیلی موارد که کلاسهای تو در تو داریم و فراخوانی های تو در تو داریم یک کم مشکل نیست )

من در خیلی از مواقع در استفاده از کلاسها از یک event استفاده میکنم و اون event رو در کلاس فراخواننده triger میکنم و خیلی خوب هم جواب میده
تو فرم ها هم این راه جواب میده


به نظر شما بهترین راه کدومه

Mahdi.Kiani
دوشنبه 09 مهر 1386, 14:15 عصر
من هم ورودتون رو تبریک میگم




حالا یک سوال از همه دوستان
برای اینکه ما بتونیم به property های فرم اول دسترسی داشته باشیم نیاز به یک object از فرم اول در درون فرم دوم داریم تا بتونیم به property های فرم تول دسترسی داشته باشیم

به نظر شما این راه مشکلی نداره ؟؟( در خیلی موارد که کلاسهای تو در تو داریم و فراخوانی های تو در تو داریم یک کم مشکل نیست )

من در خیلی از مواقع در استفاده از کلاسها از یک event استفاده میکنم و اون event رو در کلاس فراخواننده triger میکنم و خیلی خوب هم جواب میده
تو فرم ها هم این راه جواب میده


به نظر شما بهترین راه کدومه


ممنون به خاطر تبریک
در مورد فرم ها و دسترسی فرم 2 به فرم 1 هم راه های زیادی وجود داره
event ها ، delegate ها و ....
منظور من از اینکه گفتم روش عالیه این نبود که بهترین روش است
بلکه با توجه به نیاز باید از روش های متفاوت استفاده کرد
مثلا موقعی که میخواین یه فرمی را Show کنید که کاربر درون فرم دوم اطلاعات وارد کنه و پس از بستن فرم 2 از اطلاعات وارد شده در فرم 1 استفاده کنید property میتونه خیلی موثر باشه
چون معمولا فرم های دومی که برای این کاربرد به کار میروند به صورت ShowDialog باز میشوند
و در فرم 1 میشه با استفاده از کد زیر و همون property ها از اطلاعاتی که کاربر در فرم 2 وارد کرده استفاده کرد





Form2 newFrom2 =new Form2();
if(newForm2.ShowDialog()== Dialogresult.Ok)
{

// code for retriving data from Form2
}



حتی با استفاده از proprty ها میشه یک تکست باکس را از فرم 1 به تکست باکسی از فرم 2 طوری وصلش کرد که به محض تغییر دادن اطلاعات در تکست باکسی که روی فرم 2 است اطلاعات در همان لحظه به تکست باکس فرم 1 هم انتقال پیدا کنه
بدون اینکه نیازی باشه فرم 2 بسته بشه

و اما در مورد Event ها و Delegate ها وقدرتی که دارن که اصلا جای بحث نیست
یاد ندارم برنامه ای نوشته باشم و از قدرت این ابزار ها استفاده نکرده باشم
موفق باشید