PDA

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



smt1383
یک شنبه 16 خرداد 1389, 09:58 صبح
با سلام خدمت دوستان
فرض کنیم فرم اصلی ما Form1 است و ما یک فرم دیگر به نام Form2 داریم. می خواهیم از داخل frm2 که یک نمونه از فرم Form2 است به کنترلهای فرم اصلی (مثلاً کنترل textbox1 داخل Form1) دسترسی پیدا کنیم. این سوال به کرات تکرار شده و راه حلی که اکثر دوستان ارائه داده اند بدین صورت است:
ابتدا در داخل Form2 تعریف میکنیم:


public Form1 frm;

حال داخل Form1 این کد را می نویسیم:


Form2 frm2=new Form2();
frm2.frm=this;
frm2.showDialog();

حال در داخل frm2 برای دسترسی به کنترل های فرم اصلی این کد را می نویسیم:


frm.textbox1.text="123";

که البته textbox1 باید به صورت public تعریف شده باشد.
حال سوال من این است که آیا این روش با اصول برنامه نویسی شیء گرا سازگار است و از نظر مفهوم شیءگرایی کار غیر منطقی نیست؟ اگر غیر منطقی است روش منطقی این کار چیست؟
باتشکر

L u k e
یک شنبه 16 خرداد 1389, 10:39 صبح
این روش جواب می ده حالا ؟
من که از این استفاده می کنم خیلی راخت


MainFrm frm = (MainFrm)Application.OpenForms["Form Name]";

یه راه دیگه هم بهتره و درد سر نداره
شما توی کلاس Program





static class Program
{
private static Form1 frm = new Form1();

public static Form1 MainFrm
{
get { return frm; }
}

[STAThread]
static void Main()
{
Application.Run(frm);
}
}



واسه دسترسی هم مثلا :


Program.MainFrm.hide();

smt1383
یک شنبه 16 خرداد 1389, 11:56 صبح
راه حل های دیگری هم وجود دارد. اما من می خواستم بدانم راه حل اصولی که اصول برنامه نویسی شی گرا را نقض نمی کند کدام راه حل است؟

ji ming u
یک شنبه 16 خرداد 1389, 13:08 عصر
برنامه ات اصولي است مشكلي با شي گرائي ندارد

iman_me
یک شنبه 16 خرداد 1389, 13:20 عصر
با عرض پوزش از همه ولی این راه ها مناسب نیست البته این نظر منه
بهترین راه اینه که چند متغییر سراسری در فرم2 ایجاد کرده و با هر فرمی که دلمون بخواد بهش دسترسی داشته باشیم
فرض کنید 1 فرم پیغام دارید برای یک برنامه 20 فرمی لازم نیست هر بار کد بالا رو بنویسید در هر فرم چون متغییر رو همه فرم ها میشناسن و فقط کافی بنویسید فلان فرم . متغییر سراسری

smt1383
یک شنبه 16 خرداد 1389, 13:41 عصر
بهترین راه اینه که چند متغییر سراسری در فرم2 ایجاد کرده و با هر فرمی که دلمون بخواد بهش دسترسی داشته باشیم

البته قبلاً در تاپیک های زیادی بحث شده که استفاده از متغیر سراسری (در اغلب اوقات) مغایر با برنامه نویسی شی گرا است.

mmd2009
یک شنبه 16 خرداد 1389, 13:47 عصر
با سلام خدمت تمامی دوستان عزیز
با توجه به اینکه هنوز که هنوزه مشکل و فلسفه انتقال مقادیر بین فرم ها حل نشده است بنده طی یک اموزش یکی از روش های ساده را خدمت تمامی دوستان عزیز عرض می کنم و امیدوارم از ان راضی باشد.
ابتدا 2 فرم ایجاد کنید به نام های Form1 و Form2 و طبق دستورات زیر کنترل های را ایجاد کنید:


در Form1 :
یک Button و یک textbox که دکمه برای نمایش فرم 2 می باشد و جعبه متن برای نوشتن یک مقدار و ارسال ان به فرم شماره 2
در form2 :
یک Button و یک label ایجاد کنید که ما می خواهیم باز زدن دکمه مقدار textbox فرم شماره 1 وارد label فرم شماره 2 شود
خب حالا بریم سراغ کد نویسی :
داخل کد نویسی دکمه فرم شماره 1 کدهای زیر رو بنوسید :

Form2 f2 = new Form2();

f2.ShowDialog();

و حالا باید یک مقدار Public ایجاد کنیم که بازگشتش مقدار textbox فرم شماره یک باشه پس این کد ها رو هم وارد کنید:


public string r_str
{


get{return textBox1.Text;}



}

و حالا وارد فرم شماره 2 شوید و داخل دکمه کد زیر رو بنوسید :

Form1 f1 = new Form1();

label1.Text = f1.r_str;


به همین راحتی مقدار textbox فرم شماره 1 وارد label فرم شماره 2 شد
با تشکر

iman_me
یک شنبه 16 خرداد 1389, 15:06 عصر
البته قبلاً در تاپیک های زیادی بحث شده که استفاده از متغیر سراسری (در اغلب اوقات) مغایر با برنامه نویسی شی گرا است.
اما تا اونجایی که من میدونم از همین راه استفاده میکنن و اینطور که میبینم همه کد های اینجا
هم این رو ثابت میکنه البته به یک روش دیگه

exlord
یک شنبه 16 خرداد 1389, 15:50 عصر
با سلام خدمت تمامی دوستان عزیز
با توجه به اینکه هنوز که هنوزه مشکل و فلسفه انتقال مقادیر بین فرم ها حل نشده است بنده طی یک اموزش یکی از روش های ساده را خدمت تمامی دوستان عزیز عرض می کنم و امیدوارم از ان راضی باشد.
ابتدا 2 فرم ایجاد کنید به نام های Form1 و Form2 و طبق دستورات زیر کنترل های را ایجاد کنید:
در Form1 :

یک Button و یک textbox که دکمه برای نمایش فرم 2 می باشد و جعبه متن برای نوشتن یک مقدار و ارسال ان به فرم شماره 2
در form2 :
یک Button و یک label ایجاد کنید که ما می خواهیم باز زدن دکمه مقدار textbox فرم شماره 1 وارد label فرم شماره 2 شود
خب حالا بریم سراغ کد نویسی :
داخل کد نویسی دکمه فرم شماره 1 کدهای زیر رو بنوسید :

Form2 f2 = new Form2();
f2.ShowDialog();
و حالا باید یک مقدار Public ایجاد کنیم که بازگشتش مقدار textbox فرم شماره یک باشه پس این کد ها رو هم وارد کنید:public string r_str

{
get{return textBox1.Text;} }

و حالا وارد فرم شماره 2 شوید و داخل دکمه کد زیر رو بنوسید :

Form1 f1 = new Form1();
label1.Text = f1.r_str;
به همین راحتی مقدار textbox فرم شماره 1 وارد label فرم شماره 2 شد

با تشکر


:قهقهه::قهقهه::تشویق::تشویق: من هیچی نمیگم شاید خودت متوجه اشتباهت شدی و اصلاحش کردی ....
اگه این کد کار کنه باید جزو عجایب هشتم جهان ثبتش کنن ..........

exlord
یک شنبه 16 خرداد 1389, 15:51 عصر
برای دسترسی به فرم های دیگه که باز هستند ....

Form1 frm1 = Application.OpenForms[typeof(Form1).Name] as Form1;
استفاده از متغییر سراسری یا ارسال reference با constructor پیشنهاد نمیشود

s.khoshfekran
یک شنبه 16 خرداد 1389, 16:19 عصر
میتونید از ProPerty استفاده کنید!!

mmd2009
یک شنبه 16 خرداد 1389, 17:50 عصر
:قهقهه::قهقهه::تشویق::تشویق: من هیچی نمیگم شاید خودت متوجه اشتباهت شدی و اصلاحش کردی ....
اگه این کد کار کنه باید جزو عجایب هشتم جهان ثبتش کنن ..........


واقعا هم جایه خنده داشت :گیج:

اومدم ابروشو خوب کنم چشمش رو هم کور کردم :شیطان:

این یه مثال که نوشتم دیگه اصلا توضیح نمی دم :لبخند: اخرش این قلیون کار خودشو کرد :چشمک:

این مثال با استفاده از Property هستش

میلاد قاضی پور
یک شنبه 16 خرداد 1389, 18:23 عصر
روش من اینه که در فرم اول برای فرم دوم ایونت تعریف کنی و بعد از اینکه فرم دوم لود شد و اون ایونت اتفاق افتاد تغییرات لازم برای فرم اول ایجاد بشه . نمیدونم منظورت رو درست متوجه شدم و این روش میتونه درست باشه یا نه .

sky_in_iran
یک شنبه 16 خرداد 1389, 19:05 عصر
سلام دوست عزيز
اين مشكل در تاپيك هاي فراواني بحث شده و اساتيد محترم بارها پاسخگو بودند بزرگترين مشكل اينه كه تصور ميشه اولين راه بهترين راه و دوم اينكه رعايت اصول شي گرايي در برنامه ها و پيشنهادات دوستان كمتر يافت ميشه يك سوال چرا شما ميخواهيد اين كارو انجام بديد ؟ دليل استفاده شما براي اين كار چيه ؟ در برنامه نويسي در حد توان بايد از درگيري با UI خودداري كرد اگر اين قائده جا بيفته جواب تمام اين سوالات داده ميشود شما اگر دادهي را در فرم 1 داريد و در فرم 2 باهاش كار مي كنيد اگر برنامه شما بر اساس لايه ها باشه و يا اگر شي گرايي طراحي كنيد ديگه نيازي نداريد به باكس فرم يك دسترسي پيدا كنيد يك شي بسازي داده رو در اون نگهداري كنيد و در هرجا خواستيد استفاده كنيد همون تور كه يكي از دوستان در پست هاي قبلي اشاره كرد استفاده از پروپرتي يكي از اين روش هاي خوبه اما باز ميگم اول دليل انجام كارو پيدا كنيد شايد اگر خوب دقت كنيد نيازي به اين كار نباشه

smt1383
دوشنبه 17 خرداد 1389, 12:24 عصر
ممنون از همه دوستانی که نظر دادند. هدف من این بود که روشی استفاده کنم که منطبق با اصول oop باشد. ظاهراً استفاده از property ها منطقی ترین روش برای این کار است. ولی هنوز متوجه نشده ام که چرا روشی که من ذکر کردم منطقی نیست و کجای آن اصول برنامه نویسی شی گرا را نقض می کند؟

ahmad_ir
دوشنبه 17 خرداد 1389, 13:02 عصر
با سلام خدمت دوستان
فرض کنیم فرم اصلی ما Form1 است و ما یک فرم دیگر به نام Form2 داریم. می خواهیم از داخل frm2 که یک نمونه از فرم Form2 است به کنترلهای فرم اصلی (مثلاً کنترل textbox1 داخل Form1) دسترسی پیدا کنیم. این سوال به کرات تکرار شده و راه حلی که اکثر دوستان ارائه داده اند بدین صورت است:
ابتدا در داخل Form2 تعریف میکنیم:


public Form1 frm;

حال داخل Form1 این کد را می نویسیم:


Form2 frm2=new Form2();
frm2.frm=this;
frm2.showDialog();

حال در داخل frm2 برای دسترسی به کنترل های فرم اصلی این کد را می نویسیم:


frm.textbox1.text="123";

که البته textbox1 باید به صورت public تعریف شده باشد.
حال سوال من این است که آیا این روش با اصول برنامه نویسی شیء گرا سازگار است و از نظر مفهوم شیءگرایی کار غیر منطقی نیست؟ اگر غیر منطقی است روش منطقی این کار چیست؟
باتشکر
سلام دوست عزیز
اگه امکانش هست کد ها رو برام توضیح بدید مخصوصا قسمت frm2.frm=this
ممنون

smt1383
دوشنبه 17 خرداد 1389, 13:46 عصر
برای اینکه بتوانیم از داخل Form2 به کامپوننت های Form1 دسترسی داشته باشیم ابتدا در Form2 یک نمونه از Form1 با نام frm تعریف کرده ایم:


public Form1 frm;

حال پس از اینکه در Form1 یک نمونه از Form2 با نام frm2 ایجاد کردیم قطعه کد:


frm2.frm=this;

سبب می شود که متغیر frm که داخل Form2 تعریف شده است به Form1 اشاره کند. در نتیجه می توان با استفاده از متغیر frm به اعضایی از Form1 که به صورت public تعریف شده باشند دسترسی پیدا کرد.

maryam125
دوشنبه 17 خرداد 1389, 15:26 عصر
کاری نداره فقط باید Modifiere اون کنترل رو internal کنی .بعد تو فرم دیگه فرمی که حاوی کنترل هست رو ازش Object بسازی و کنترل رو صدا کنی.

s.khoshfekran
دوشنبه 17 خرداد 1389, 19:42 عصر
کاری نداره فقط باید Modifiere اون کنترل رو internal کنی .بعد تو فرم دیگه فرمی که حاوی کنترل هست رو ازش Object بسازی و کنترل رو صدا کنی.
یه نگاه به پست های قبلی بندازی بد نیست!

mehdi.mousavi
دوشنبه 17 خرداد 1389, 20:17 عصر
سلام.
من این مساله رو بارها قبلا توضیح داده ام و حقیقتا خسته میشم وقتی می بینم همین سوال مدام تکرار میشه که "چطوری یه متغیر رو از فرم یک به فرم دو بفرستم".

لطفا چند قدم عقب تر بیایید، و از کد UI فاصله بگیرید تا viewport وسیع تری از کاری که میخواهید انجام بدید داشته باشید. سوال اصلی، ارسال یک متغیر از یک فرم به فرم دیگه نیستش، سوال، چگونگی ارتباط بخشهای مختلف یک UI در سیستم نرم افزاری هستش.

فرض کنید، برنامه شما به چند بخش تقسیم شده. Menubar ای اون بالا، Status bar ای این پایین، یک Treeview سمت چپ صفحه، و سمت راست صفحه که خودش به دو Panel تقسیم میشه... اگر شما بخواهید با انتخاب یک آیتم در Treeview توسط کاربر، فلان آیتم منو Disable بشه، توی Status bar پیامی نوشته بشه، Panel سمت راست بالا، با اطلاعات جدیدی Refresh بشه و بخشی از Panel پایین سمت راست نیز Refresh بشه، اونوقت میخواهید چه چیزی رو به این کلاسها و بخشها بفرستید؟ میدونید بعد چند روز توسعه چنین برنامه ای، کارتون به یک اسپاگتی کد ختم میشه؟

پس لطفا چند قدم دیگه هم عقب تر بیایید و سعی کنید یک بار برای همیشه با روشی آشنا بشید که در اون روش، دیگه نیازی به رد و بدل کردن خروارها اطلاعات بین بخشهای مختلف UI به این شکل و شمایلی که تا امروز دیده اید نیست.

یکی از روشهای بسیار خوب برای انجام اینکار، استفاده از Office Automation Model هستش. این روشی است که برنامه های Microsoft Office از اون بهره میگیرن و مقالاتی چند نیز در این باب در CodeProject و MSDN Magazine منتشر شده. لطفا، اسم Omar Al Zabir رو با Office Automation Model در گوگل جستجو کنید، حداقل دو مقاله خواهید یافت (بعلاوه Sample Code) که دقیقا روش مزبور رو براتون توی C# توضیح داده. اونو مطالعه کنید و برای همیشه خودتون رو از شر این سوال که چطوری از فرم یک به فرم دو فلان اطلاعات رو بفرستم، خلاص کنید.

موفق باشید.

mmd2009
دوشنبه 17 خرداد 1389, 21:47 عصر
سلام دوست عزیز
اگه امکانش هست کد ها رو برام توضیح بدید مخصوصا قسمت frm2.frm=this
ممنون

سلام دوست عزیز

این توضیح رو اشتباه گفتم اگه پست های بعدیش رو میخوندی مشخصه که یه کم اشتباه توضیح رو دادم

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