PDA

View Full Version : دسترسی به کنترل های فرم پدر



honey_sr
چهارشنبه 27 تیر 1386, 09:32 صبح
چه طوری می تونم توی فرم پدر به دیتاسورس dataGridView فرم پدرم دسترسی داشته باشم؟

mehdi.mousavi
چهارشنبه 27 تیر 1386, 09:39 صبح
چه طوری می تونم توی فرم پدر به دیتاسورس dataGridView فرم پدرم دسترسی داشته باشم؟


سلام.
برای گرفتن فرم Parent، میتونید از this.ParentForm در کلاس فرمتون استفاده کنید. بعد اونو به کلاس پدر Cast کنید و در نهایت بعد از public تعریف کردن DataGridView Control، میتونید به اون دسترسی پیدا کنید:


MyParentForm parent = (MyParentForm)this.ParentForm;
//do whatever you need with the parent.dataGridView

honey_sr
چهارشنبه 27 تیر 1386, 10:03 صبح
منظورتون از cast کردن چیه؟ توی property های dataGridView باید اونو public کنم؟م

honey_sr
چهارشنبه 27 تیر 1386, 10:09 صبح
مرسی جواب رو پیدا کردم . ممنون از راهنماییتون.

mehdi.mousavi
چهارشنبه 27 تیر 1386, 10:12 صبح
منظورتون از cast کردن چیه؟ توی property های dataGridView باید اونو public کنم؟م


سلام.
اگر تو MSDN نگاه کنید، می بینید که ParentForm یه نمونه از کلاس Form بر می گردونه. اما این کلاس Form نیست که حاوی اون DataGridView Control هستش، بلکه کلاس MyParentForm هستش... برای همین شما به Compiler می گید که این instance گرفته شده یک MyParentForm هست تا بتونید از متودها و Property های public در کلاس MyParentForm استفاده کنید. به این عمل میگن، Cast کردن. مثلا:

Int32 n = (Int32).5f;

من دارم تو این کد، عدد .5 رو که از نوع float هست به اینتیجر Cast میکنم. در واقع دارم به Compiler میگم که "کاری نداشته باش که .5 float هست، من خودم میدونم که میخوام چی کار کنم".

در مورد اونیکی سوال هم باید بگم بله، باید dataGridView رو public تعریف کنید تا بتونید از بیرون بهش دسترسی داشته باشید.

honey_sr
چهارشنبه 27 تیر 1386, 14:56 عصر
با این کد فرم فرزند باز شده



frmShow = newDestituteForm();
frmShow.MdiParent = this.MdiParent;
frmShow.TopMost = true;
frmShow.Show();


من این کدو توی فرم فرزند نوشتم


DestitutePension.Destitute.DestituteList frm = (DestitutePension.Destitute.DestituteList)this.Par entForm;

frm.dgvDestituteList.DataSource = null;



الان هم error میده

Unable to cast object of type 'DestitutePension.MainForm' to type 'DestitutePension.Destitute.DestituteList'.

چرا؟:ناراحت::ناراحت:

اَرژنگ
چهارشنبه 27 تیر 1386, 15:52 عصر
چه طوری می تونم توی فرم پدر به دیتاسورس dataGridView فرم پدرم دسترسی داشته باشم؟
در برنامه نویسی شئی‌گرا ، کسی دست نمی‌اندازه به کنترلهایه یک ابجکت دیگر ، از آن ابجکت درخواست میکنه که کنترلهاش را در اخختیارش بگذاره و یا اینکه هر کاری را که لازم است که با کنترلها انجام بشه را خوده ابجکت که کنترلها را داره باهاشان انجام میده.
اینها ساده ترین و پیش پا افتاده‌ترین اصول برنامه نویسی شئیگرا هسنتد. اگرچه برنامه نویسی شیگرا هم دیگه تعریف زیادی نداره ولی از روشهایه پیشنهاد شده خیلی بهتره.

mehdi.mousavi
چهارشنبه 27 تیر 1386, 17:40 عصر
با این کد فرم فرزند باز شده



frmShow = newDestituteForm();
frmShow.MdiParent = this.MdiParent;
frmShow.TopMost = true;
frmShow.Show();
من این کدو توی فرم فرزند نوشتم


DestitutePension.Destitute.DestituteList frm = (DestitutePension.Destitute.DestituteList)this.Par entForm;

frm.dgvDestituteList.DataSource = null;

الان هم error میده

Unable to cast object of type 'DestitutePension.MainForm' to type 'DestitutePension.Destitute.DestituteList'.

چرا؟:ناراحت::ناراحت:


سلام.
بجای این خط


DestitutePension.Destitute.DestituteList frm = (DestitutePension.Destitute.DestituteList)this.Par entForm;

باید بنویسید:



DestitutePension.MainForm parent = (DestitutePension.MainForm)this.ParentForm;


به این ترتیب در Child Form خودتون، به parent دسترسی خواهید داشت. البته من حرف آرژنگ رو تایید می کنم، چون این مدل برنامه نویسی در نهایت به کلاف سر در گمی می انجامه که maintenance اش، کابوسه.

honey_sr
پنج شنبه 28 تیر 1386, 11:53 صبح
DestitutePension.MainForm parent = (DestitutePension.MainForm)this.ParentForm;


من کاری به فرم main ندارم .فرم پدر من DestituteList هست.
DestitteForm فرم فرزنده و DestituteList پدرشه و MainForm پدر DestituteList .

؟؟؟؟؟؟؟؟؟؟؟

mehdi.mousavi
پنج شنبه 28 تیر 1386, 13:27 عصر
من کاری به فرم main ندارم .فرم پدر من DestituteList هست.
DestitteForm فرم فرزنده و DestituteList پدرشه و MainForm پدر DestituteList .
؟؟؟؟؟؟؟؟؟؟؟


سلام.
باید خدمتتون عرض کنم که اسامی که برای کلاسهاتون انتخاب میکنید، با هیچ اصول naming convention ای سازگار نیست به همین دلیل هیچگونه اطلاعاعی به خواننده کد نمیده. اما در مورد مشکلی که دارید، کدی که شما نوشتید:

frmShow = newDestituteForm();
frmShow.MdiParent = this.MdiParent;
frmShow.TopMost = true;
frmShow.Show();

داره میگه که MdiParent فرم فرزند، MdiParent فرم فعلی هستش که میشه MainForm! پس شما بر چه اساسی می گید که DestituteForm فرزند DistituteList هست؟ فقط به صرف اینکه Window جدیدی رو از درون Window دیگه ای باز کنید، سیستم نمیتونه روابط بین Window ها رو تشخیص بده. اگر کدی که نوشتید واقعا کاری هستش که میخواهید انجام بدید، یعنی MdiParent فرم فرزند همون MdiParent فرم DistituteList (یعنی MainForm) هستش، باید ctor کلاس DestituteForm رو تغییر بدید تا یه instance از کلاس DestituteList بگیره و جای کد فوق، بنویسید :

frmShow = new DestituteForm(this);

بدین ترتیب خودتون دارید Reference به کلاس DistituteList رو به فرم فرزند میدید و اونجا هر کاری بخواهید میتونید انجام بدید. امیدوارم اینبار پاسخ سوالتون رو کامل داده باشم.