# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > C#‎‎ >  نحوه ی ارتباط و پاس كردن مقادير ميان چند فرم ويندوز

## محمد مومنی

میخوام بین کنترلها توی فرمهای مختلف ارتباط برقرار کنم.مثلا چطوری میتونم محتویات یه textbox در یه فرم رو در یه textbox توی یه فرم دیگه چاپ کنم. 
لطفا راهنمایی کنید.متشکرم.

----------


## Panje Tala

با سلام
اصلا نیازی به استفاده از بانک نیست. شما میخواهید فرم شما یک یا چند پارامتر را به فرم بعدی پاس کند برای این کار باید Constructor فرم دوم تغییر یابد و پارامتر بگیرد. constructor یک فرم یک متد Public می باشد که هم نام فرم میباشد. درون آن InitializeComponent هم فراخوانی می گردد.بجای دو پرانتز خالی باید نوع و پارامتری که می خواهید به فرم مورد نظر pass شود را مشخص کنید. سپس مقادیر را درون متد به متغییرهای عمومی که درون فرم تعریف کردید نسبت دهید تا همه جا بتونی از اونها استفاده کنی بعنوان مثال فرض کنید من بخواهم یک پارامتر string را به فرم دوم بفرستم. بنابراین در constructor فرم 2 می نویسم

private string test="";
	public Form2(string p_test)
		{
			//
			// Required for Windows Form Designer support
			//
test=p_test;
			InitializeComponent();

			//
			// TODO: Add any constructor code after InitializeComponent call
			//
		}

حال هنگام فراخوانی فرم دوم باید پارامتر به آن پاس شود:

form2 frm_2=new form2("عبارتی که می خواهید پاس شود");
frm_2.showdialog();

----------


## hmm

سلام،
میدونم سوال تکراریه ولی تو جوابها هنوز روش مشخصی ارائه نشده
تو فرم یه grid وجود داره که وقتی سطری انتخاب میشه با زدن کلیدی یه فرم جدید باز میشه و اطلاعات کاملتر او سطر رو تو فرم باز شده جدید نشون میده حالا چطوری مقدار کلید ردیف grid انتخابی رو به فرم جدید پاس کنم

----------


## mehranFX

> سلام،
> میدونم سوال تکراریه ولی تو جوابها هنوز روش مشخصی ارائه نشده
> تو فرم یه grid وجود داره که وقتی سطری انتخاب میشه با زدن کلیدی یه فرم جدید باز میشه و اطلاعات کاملتر او سطر رو تو فرم باز شده جدید نشون میده حالا چطوری مقدار کلید ردیف grid انتخابی رو به فرم جدید پاس کنم


در کلاس مربوط به فرم دوم ات یک متغیر تعریف کن و  در فرم اول قبل از تشکیل شیء نمونه از کلاس فرم دوم جهت نمایش بر روی مونیتور  ، مقدار این متغیر رو نیز Set کن!

----------


## ali_kolahdoozan

modifyers  اون شئی رو public کن (درون property  حل می شه

----------


## Mehdi Asgari

سازندۀ فرم دوم رو طوری تغییر بده که یک متغیر (از هر نوعی که میخوای) رو به عنوان پارامتر بگیره ، بعد در هنگام ایجاد یک شی جدید از فرم دوم ، اون مقداری رو که میخوای انتقال بدی ، به عنوان پارامتر سازنده منتقل کن.

----------


## hmm

> سازندۀ فرم دوم رو طوری تغییر بده که یک متغیر (از هر نوعی که میخوای) رو به عنوان پارامتر بگیره ، بعد در هنگام ایجاد یک شی جدید از فرم دوم ، اون مقداری رو که میخوای انتقال بدی ، به عنوان پارامتر سازنده منتقل کن.





> در کلاس مربوط به فرم دوم ات یک متغیر تعریف کن و در فرم اول قبل از تشکیل شیء نمونه از کلاس فرم دوم جهت نمایش بر روی مونیتور ، مقدار این متغیر رو نیز Set کن!


اینجاست که ترجمه متون بلاد بیگانه کمر برنامه نویس رو میشکنه!
دوستان اگه میتونن یک خط کدش رو بنویسن
البته لطف میکنن

----------


## Mehdi Asgari

حاجی ، من از جایی ترجمه نکردم ، فکر کردم انقدر برنامه نویسی بلدی که با یه نیش نکته ، خودت تا آخرش رو بخونی.
این sample رو دانلود کن ، با کلیک روی button1 ، اطلاعات ردیف انتخاب شده به فرم دوم منتقل میشه ، حالا اونجا دست خودته که چیکار می کنی باهاش.
(من به عنوان مثال Text فرم دوم رو مساوی کلید اصلی اون ردیف انتخاب شده قرار دادم)

----------


## hmm

سلام؛
ببین "*سید*" سوالی کردم جوابش رو دادی ازت ممنونم ولی...
لازم نیست تعداد پروژه های که با دات نت نوشتم رو بگم ولی میتونی به پاسخ حقیر که به سوالات بعضی از دوستان دادم توجه کنی 

جواب این سوالات رو سالها قبل از العان میدونستم!

ولی هدف من از طرح این سوال و این سوال و این سوال این بود که بدونم چقدر افراد این بخش تونستن مفاهیم ابتدایی دات نت رو بفهمند و اگه عمری بود تا آخر ماه یه جمع بندی کلی خدمت اعضا میدم .
بهرحال سعی کن یا لطف کنی و به سوالات بقیه با کمال ادب جواب بدی یا لطف کن و اصلا جواب نده!
واژه های بکار گرفته توسط شما و بیشتر mehranFX جوبه ولی بدرد کسی که اول راه دات نته نمیخوره خواستم تو پست قبلیم اینو بصورت غیر مشهود بگم که این شیوه پاسخ برای هم رده ها خوبه نه برای مبتدیها !
بهرحال از پاسخت ممنون

----------


## alirezador

سلام من میخواستم بدونم که چطوری بدون استفاده از متد show() یک مقدار را به فرم دوم میفرستید و چطوری فرم را نمایش میدهید؟

----------


## habedijoo

سلام 
یه مثال خیلی ساده برات گذاشتم . امیدوارم منظورت همین باشه .

----------


## mahani

ببخشید اگر این سوال کمی تکراری است ولی من هنوز جواب مشخصی برای آن پیدا نکردم
فرض؟ فرم١ در ابتدای برنامه اجرا میشود و فرمهای٢و٣ توسط فرم١ باز میشوند و مسلما فرم١ به فرمهای٢و٣ دسترسی دارد 
سوال؟ فرم٢ چگونه میتواند به فرمهای١و٣ دسترسی داشته باشد 
staticvoid Main()
{
Application.Run(newForm1());
}

privatevoid Form1_Load(object sender, EventArgs e)
{
Form2 form2 = newForm2();
Form3 form3 = newForm3();
form2.Show();
form3.Show();
}

----------


## محمد میرمصطفی

publicstatic Form1 MainForm;
staticvoid Main()
{
MainForm = new Form1();
Application.Run(MainForm);
}


...(anywehere) [Namespace].MainForm.TextBox1.Text...

----------


## hamid_isf_1360

ابتدا یک کلاس به برنامه اضافه می کنید مثلا به نام myConfig بعدش فرض کنید در برنامتون 100 تا فرم دارید که می خواهید از آخری به اولی و از اولی به آخری پارامتر پاس کنید یا هر کاری که دلتون خواست را انجام بدید مثلا از فرم آخری فرم اولی را مینیمایز کنید.

حال داخل کلاسی که ساختید به تعداد فرم هاتون متغیری استاتیک از نوع آن فرم بسازید به شکل زیر
public static f1 Form1;
و برای فرم های بعدی هم به همین صورت مثلا
public static f100 Form100;
حالا هرجا خواستید یکی از فرم ها را از داخل یه فرم دیگه ظاهر کنید کد زیر را بنویسید
مثلا
Config.f1 = new Form1();
Config.f1.Show();

حالا فرض کنید می خواهید از فرم آخری فرم اولی یا وسطی را رنگش را عوض کنید خوب خیلی راحته به شکل زیر عمل کنید
Config.f1.BackColor=Red;

دقت کنید اگه می خواهید به اشیائ درون خود فرم ها هم دسترسی داشته باشد باید خاصیت modifiers
آنها را به حالت public درآورید

امید وارم این مطلب براتون جالب باشه 
موفق و پیروز باشید.

----------


## Alireza_Salehi

به به !
میشه بگید چه لزومی داره به همه فرم ها اون هم اینطوری دسترسی داشته باشیم ؟

البته ارتباط بین فرم ها حتما لازمه ، ولی این طوری که همون برنامه نویسی Modular بهتر بود دیگه چه نیازی به OOP بود، شاید بهتر بود به ازای همه کلاس های دات نت فریمورک متغییر استاتیک تعریف میکردند ،بعدش این new رو حذف می کردن تا ملت این همه عذاب نکشن ؟

اگر در طراحی فرم ها و وظیفه هر کدام در زمان طراحی دقت کرده باشید ارتباط بین فرم ها به حداقل میرسه (یعنی کلاس ها تا حد ممکن مستقل از هم باشند)و برای اون حداقل هم نیازی به این کارها نیست.

----------


## kiani.mehdi

> ابتدا یک کلاس به برنامه اضافه می کنید مثلا به نام myConfig بعدش فرض کنید در برنامتون 100 تا فرم دارید که می خواهید از آخری به اولی و از اولی به آخری پارامتر پاس کنید یا هر کاری که دلتون خواست را انجام بدید مثلا از فرم آخری فرم اولی را مینیمایز کنید.
> 
> حال داخل کلاسی که ساختید به تعداد فرم هاتون متغیری استاتیک از نوع آن فرم بسازید به شکل زیر 
> public static f1 Form1;
> و برای فرم های بعدی هم به همین صورت مثلا 
> public static f100 Form100;
> حالا هرجا خواستید یکی از فرم ها را از داخل یه فرم دیگه ظاهر کنید کد زیر را بنویسید
> مثلا 
> Config.f1 = new Form1();
> ...


 
 **** دوست عزیز، لطفا با مزاح کردن به دیگران بی احرامی نکنید. ممنون ****

ببینم اونوقت میشه بگین private و protect و امثال اینا که برای اعمال کپسوله سازی کد ها(encapsulation) هستند به چه درد می خوره؟

اسفاده از static خیلی خوبه ولی نه برای یک همچین کاری عزیز

البته اشکالی نداره خوب فروم به همین درد میخوره که ادم اشکالاتش برطرف بشه
موفق باشید 
مهدی کیانی

----------


## hamid_isf_1360

بسم رب العشق

این روش برای این خوبه که شما در روش های *عادی* مجبورید وقتی می خواهید مثلا از 
فرم دوم که بوسیله فرم اول ایجاد شده رنگ تکست باکس فرم اول را تغییر بدید نمی تونید.
----------------------------------------------------------------------------------------------
روش  owner و دیگر روش های دیگه هم هست ولی این خیلی راحت تره.
----------------------------------------------------------------------------------------------
در ضمن استاتیک تعریف شده که نیاز نداشته باشیم از کلاس new بسازیم.
----------------------------------------------------------------------------------------------
اما با این روش تمام فرمهای برنامه بصورت سیال در میاند و هر کاری که خواستید می تونید 
بین آنها انجام بدید , راستی اگه بازم دیدید این روش به دردتون نمی خوره یه روش راحتر از این 
بیان کنید همه استفاده می کنیم 
----------------------------------------------------------------------------------------------
اینجا اومدیم یاد بگیریم
و آقای کیانی عزیز من قصد مزاح و بی احترامی به کسی را ندارم

یا علی

----------


## Sorenaa_s

> بسم رب العشق
> 
> این روش برای این خوبه که شما در روش های *عادی* مجبورید وقتی می خواهید مثلا از 
> فرم دوم که بوسیله فرم اول ایجاد شده رنگ تکست باکس فرم اول را تغییر بدید نمی تونید.
> ----------------------------------------------------------------------------------------------
> روش owner و دیگر روش های دیگه هم هست ولی این خیلی راحت تره.
> ----------------------------------------------------------------------------------------------
> در ضمن استاتیک تعریف شده که نیاز نداشته باشیم از کلاس new بسازیم.
> ----------------------------------------------------------------------------------------------
> ...


ولی دوست عزیز به نظر من این روش هم Encapsulation و هم Abstraction رو نقض می کنه.

----------


## Alireza_Salehi

> بسم رب العشق
> 
> این روش برای این خوبه که شما در روش های *عادی* مجبورید وقتی می خواهید مثلا از 
> فرم دوم که بوسیله فرم اول ایجاد شده رنگ تکست باکس فرم اول را تغییر بدید نمی تونید.
> ----------------------------------------------------------------------------------------------
> روش owner و دیگر روش های دیگه هم هست ولی این خیلی راحت تره.
> ----------------------------------------------------------------------------------------------
> در ضمن استاتیک تعریف شده که نیاز نداشته باشیم از کلاس new بسازیم.
> ----------------------------------------------------------------------------------------------
> ...


اصلا بحث به درد بخور بودن و راحتی این روش نیست، بحث سر اینه که این روش شما بسیاری از مطالبی که در برنامه نویسی شی گرا وجود دارد را نقض می کند!

یعنی قوانینی که در OOP در نهایت به سود برنامه نویس هستند در این روش نادیده گرفته میشن !

در OOP هر کلاس به عنوان یک جعبه سیاه در نظر گرفته میشه که از طریق پارامترها ومتد ها با خارج ارتباط داره نه از طریق در اختیار قرار دادن اعضای داخلیش به طور مستقیم(public)!

در ضمن Owner با این روش هیچ ربطی با هم ندارند ، Owner صرفا یک ارجاع به شی پدر هستش ،ولی این طوری شما یک شی جدید ایجاد میکنید.

این روش ممکنه کار راه بنداز باشه ولی صحیح نیست!

----------


## omid_Ahmadi

@ hamid_isf_1360:

روش  شما همونطور که دوستان گفتن، با اصول شیئ گرایی تناقض زیادی داره. روش کم و بیش واضحه (البته نقص هایی هم داره)، اما مشخص نیست که در چه شرایطی قرار گرفتید که به استفاده از این روش رسیدید. اما هر چی هست، مشخصه که قسمتی از طراحی مشکل داشته، می تونید حالتی رو که به این روش رسیدید بگید تا دوستان اون رو بررسی کنن. 

موفق باشید.

----------


## Keramatifar

دوستان عزیز
هر برنامه نویس برای نوشتن برنامه هاش از روش هایی که ممکن منحصر به خودش باشه استفاده می کنه و تا زمانی که این روش ها Bug ای در برنامش ایجاد نکرده حتی اگه قوانین OOP رو هم نقض کنه نمیشه به فکر اون برنامه نویس ایراد گرفت ...
پس سعی کنید یه ذره با هم مهربون تر باشید و اگر هم می خواهید انتقادی بکنید طوری اینکار رو نکنید که طرف یک سپر و شمشیر بگیره دستش از خودش دفاع کنه می تونید از ادبیات بهتری برای اینکار استفاده کنید تا اون طرف هم از پستتون در جهت ارتقا, سطح علمیش استفاده کنه ...

در ضمن این روشی که ایشون مطرح کردن برای برنامه نویسان مبتدی و کسانی که با OOP آشنایی زیادی ندارن بسیار مفیده

----------


## omid_Ahmadi

> هر برنامه نویس برای نوشتن برنامه هاش از روش هایی که ممکن منحصر به خودش باشه استفاده می کنه و تا زمانی که این روش ها Bug ای در برنامش ایجاد نکرده حتی اگه قوانین OOP رو هم نقض کنه نمیشه به فکر اون برنامه نویس ایراد گرفت ...
> پس سعی کنید یه ذره با هم مهربون تر باشید و اگر هم می خواهید انتقادی بکنید طوری اینکار رو نکنید که طرف یک سپر و شمشیر بگیره دستش از خودش دفاع کنه می تونید از ادبیات بهتری برای اینکار استفاده کنید تا اون طرف هم از پستتون در جهت ارتقا, سطح علمیش استفاده کنه ...


تقریباً در هیچ پستی از این تاپیک این مورد نقض نشده، فقط چون همه افرادی که نظر دادن، مخالف بودن، این حس ایجاد شده که اون فرد داره تحقیر میشه. پس بهتره دیگه در این مورد صحبت نشه.




> در ضمن این روشی که ایشون مطرح کردن برای برنامه نویسان مبتدی و کسانی که با OOP آشنایی زیادی ندارن بسیار مفیده


این روش فقط برای افرادی که در حال یادگیری هستن، می تونه مفید باشه تا مزایا و معایب اون رو بررسی کنن. همین. ولی در هیچ برنامه واقعی استفاده از اون نمی تونه مفید باشه (البته با توجه به توصیحات اندکی که راجع به اون گفته شده).

----------


## hassan razavi

می تونید یک متد Public در فرمتون بسازید که با صدا زدن آن ، کار مورد نظرتون رو براتون انجام بده.

----------


## hassan razavi

باتشکر از night_fall2 عزیز و فعال
با استفاده ازز Singleton Pattern می تونید به منظورتون برسید. از لینک زیر کمک بگیرید
https://barnamenevis.org/showth...ight=singleton

----------


## amirferdowsi

سلام 
منم یک همچنین مشکلی رو دارم به این صورت که یک فرم دارم که توسط اون اطلاعات پرسنل گرفته میشه و اون رو در بانک اطلاعاتی ذخیره می کنه و فرم دیگر هم یک کنترل دیتا گرید دارم که اون اطلاعات رو نمایش میده ، حالا من می خوام زمانی که هر دو فرم باز هستند اگر در فرم اول اطلاعات جدیدی وارد شد باز زدن دکمه بعد از ثبت شدن اطلاعات در بانک اطلاعاتی ، دیتاگریدی که در فرم دوم من هست دوباره Bind بشه و اطلاعات جدید رو نمایش بده .
ممنون میشم که در این زمینه من رو راهنمایی فرمائید.

----------


## fatemeh rahimi

من هم یه همچین مشکلی دارم ،ممنون میشم راهنمایی کنید .
دلیل اینکه می خوام اینکار رو بکنم:
من در یه فرمم یه button به نام edit دارم که وقتی کاربر کلیک میکنه اطلاعاتی که قبلا وارد کرده باید توی فرم دیگه در textbox های مربوطه نمایش داده بشه،تا با خوندن اطلاعات قبلی اگه خواست امکان ویرایش داشته باشه.
حالا من تو رویداد کلیک مربوط به button ،متدی که اطلاعات رو از db می گیره نوشتم ولی به textboxهای فرم بعدی دسترسی ندارم تا بتونم پرشون کنم!

----------


## sinpin

این لینک رو هم ببینید :
https://barnamenevis.org/showthread.php?p=446800

----------


## Mahdi.Kiani

> من هم یه همچین مشکلی دارم ،ممنون میشم راهنمایی کنید .
> دلیل اینکه می خوام اینکار رو بکنم:
> من در یه فرمم یه button به نام edit دارم که وقتی کاربر کلیک میکنه اطلاعاتی که قبلا وارد کرده باید توی فرم دیگه در textbox های مربوطه نمایش داده بشه،تا با خوندن اطلاعات قبلی اگه خواست امکان ویرایش داشته باشه.
> حالا من تو رویداد کلیک مربوط به button ،متدی که اطلاعات رو از db می گیره نوشتم ولی به textboxهای فرم بعدی دسترسی ندارم تا بتونم پرشون کنم!


سلام

دوستانی که معمولا اینگونه مشکلات را دارا هستند اگر به این نکته ای که میگم دقت کنند دیگه هیچ وقت به دنبال اینگونه سوالات برای پاسخ به مشکلاتشون نیستند

نکته:
برای ایجاد ارتباط بین آبجکت های مختلف در اینگونه مسائل فقط و فقط به ردو بدل کردن داده ها فکر کنید نه به رد وبدل کردن خود آبجکت ها

مشکل اکثر دوستان اینه که وقتی میخوان به داده های یه آبجکت دیگه دسترسی پیدا کنند فورا ذهنشون را درگیر این موضوع می کنند که چگونه می شه کنترل آبجکت دیگه را در اختیار گرفت. اگر به جای دسترسی به خود ابجکت به فرستادن داده ها بین آبجکت ها فکر کنید اکثر مشکلاتتون حل میشه

نکته 2:
استفاده از property ها یکی از بهترین گزینه ها و در عین حال از ساده ترین گزینه ها برای ردو بدل کردن داده ها بین آبجکت ها می باشد 


در ادامه یکی دو تا مثال می زنم تا با این مفاهیم بیشتر آشنا بشین و امید به اینکه در آینده اینگونه سوالات کم بشه و تمرکز بیشتری در حل مسائل و روش هایی که به دست میارین بکنین

مثال اول
فرض کنید 2 تا فرم دارین که به صورت زیر طراحی کردین
در فرم 1 یک button دارین که با کلیک کردن بر روی اون فرم دومی نشان داده خواهد شد و علاو بر اون یک داده هم به فرم دوم پاس خواهیم داد
این داده هر چیزی می تونه باشه. از یک رشته ساده گرفته تا یه مجموعه داده ....

در این مثال فرض می کنیم که یک رشته را از فرم 1 به فرم 2 پاس میدیم
در فرم دوم هم یک button دارین که با کلیک کردن بر روی اون رشته گرفته شده از فرم 1 را نشون میده

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





using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

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






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




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        string localString = string.Empty;

        public Form2(string str)
        {
            InitializeComponent();
            localString = str;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("I Recived Form \n"+localString);
        }

        
    }
}



 


همانطور که میبینید در Constructor فرم 2 یک آرگومان از جنس string قرار دااده شده است. به این معنی که هر آبجکتی که از کلاس فرم 2 یک نمونه ایجاد می کنه بایستی یک مقدار string هم به اون پاس بده

در رویداد کلیک Button در فرم  1 ابتدا یک نمونه از فرم 2 ایجاد شده و مقدار text مربوط به فرم 1 به اون پاس داده شده. با این عمل و با کدی که بعد از خط InitializeComponent در Constructor فرم 2 نوشته شده یعنی کد 



 localString = str;



مقدار رشته ای که از فرم 1 دریافت شده را در متغیر localString که در فرم 2 تعریف شده است، قرار می گیرد. حال متغیر localString در هر کجای فرم 2 که بخواین قابل دسترسی است

در رویداد کلیلکbutton در فرم 2 هم این مقدار نشون داده میشه

**************************************************  **
در این مثال بدون استفاده از property ها این کار انجام گرفت
اما اگر تعداد داده ها بیشتر باشن توصیه می شه که از این روش استفاده نشه

در ادامه مثال فوق را با استفاده از property ها انجام میدیم

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



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        string passedParameter;

        public string PassedParameter
        {
            get { return passedParameter; }
            set { passedParameter = value; }
        }

        public Form2()
        {
            InitializeComponent();
           
        }

       

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("I Recived Form \n"+passedParameter);
        }

        
    }
}



در این حالت تغییری در Constructor فرم 2 به وجود نمیاریم بلکه یک property به نام PassedParameter تعریف کردی ایم که توسط این property می تونیم داده هایی را از آبجکت های دیگه (در اینجا کلاس فرم 1) دریافت کنیم

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



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

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




همانطور که می بینید در رویداد کلیک دکمه در فرم 1 پس از نمونه گیری از فرم 2 به خاصیت PassedParameter از این فرم دسترسی پیدا کردیم و مقدار Text مربوط به فرم 1 را در این property قرار دادیم

**************************************************  *********
خیلی از دوستان خیال خودشان را راحت می کنند و در یک چنین مواقعی کلاس فرم 2 را به صورت زیر تعریف می کنند



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
      public  string passedParameter;

       

        public Form2()
        {
            InitializeComponent();
           
        }

       

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("I Recived Form \n"+passedParameter);
        }

        
    }
}



یعنی به جای تعریف property خود متغیر را به صورت public تعریف می کنند
درست است که با این روش هم میشه به مقدار passedParameter دسترسی داشت اما در این روش اصل Encapsulation که یکی از اصول مهم شی گرایی است زیر سوال میره و استفاده از این نوع حرکات در زبانی مثل سی شارپ که به قول بعضیا نطفش را با OOP بستن کار درستی نیست


فعلا خسته شدم دیگه حال ندارم بنویسم
ایشالا در ادامه حسش اومد ،نحوه دسترسی به اطلاعات فرم 2 در فرم 1 را با همین property ها (که خیلی میگن نمیشه) را خواهم گفت
همچنین دسترسی به کنترل های آبجکت های دیگه و تغییر دادن خواص اونا به شکلی که OOP هم زیر سوال نره را با همین Property ها خواهم گفت

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

استفاده ویاد گیری Pattern هایی همچون Singeltone برای ایجاد تنها یک نمونه از یک آبجکت (که باز مشکل خیلی از دوستانه) یا MVC که دنیایی هست واسه خودش و ... نیز توصیه میشه 
امید وارم دوستان خوبمون من جمله سرکار خانم fateme rahimi بایستی فهمیده باشن که چگونه باید مشکلشون را حل کنند

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

موفق باشید

----------


## اَرژنگ

یک نکته:
 PassedParameter برایه نامگذاری پروپرتی درست نیست. طرز تفکر نباید به این باشد که از بیرون چی آمده، ایده انکپسولیشن این است که محلی فکر کنیم. 
به جایه PassedParameter ، نامه پروپرتی باید برایه کلاس معنی بده، اسمه بهتر MessageText و یا هر چیزه دیگری که برایه کلاس معنی دارد بهتر است.

در ضمن جواب جناب رضوی که فرمودند : "می تونید یک متد Public در فرمتون بسازید که با صدا زدن آن ، کار مورد نظرتون رو براتون انجام بده"  از نظر برنامه نویسی شئیگرائی کاملا درست است.

با تشکر از نایت فال ۲ برایه این مقاله، این باید جزوه اعلانات این انجمن در بالا میخ‌ بشه.

----------


## Mahdi.Kiani

> یک نکته:
>  PassedParameter برایه نامگذاری پروپرتی درست نیست. طرز تفکر نباید به این باشد که از بیرون چی آمده، ایده انکپسولیشن این است که محلی فکر کنیم. 
> به جایه PassedParameter ، نامه پروپرتی باید برایه کلاس معنی بده، اسمه بهتر MessageText و یا هر چیزه دیگری که برایه کلاس معنی دارد بهتر است.
> 
> در ضمن جواب جناب رضوی که فرمودند : "می تونید یک متد Public در فرمتون بسازید که با صدا زدن آن ، کار مورد نظرتون رو براتون انجام بده"  از نظر برنامه نویسی شئیگرائی کاملا درست است.
> 
> با تشکر از نایت فال ۲ برایه این مقاله، این باید جزوه اعلانات این انجمن در بالا میخ‌ بشه.


دوست عزیز ممنون از توجهتون اما تنها دلیل اینکه این نام برای این property انتخاب شده این بود که دوستانی که اصلا نمی دونن propertry جیه و به چه دردی میخوره متوجه بشن که این در واقع مانند یک پارامتر واسط که کار اصلیش انتقال داده بین دو فرم 1 و 2 هست

اگه توضیحات اول همین مقاله (به قول شما)  را خوب خونده باشین من گفتم که داده هر چیزی میتونه باشه و فقط به عنوان مثال رشته در نظر گرفته شده
تنها و تنها هدف من از این نوشته ها که به زودی تکمیل ترش می کنم(اگه حس نوشتن بیاد) این بود که به دوستانی که مرتبا این سوالات را می کنن بگم که به جای دسترسی مستقیم به آبجکت ها داده ها را پاس بدین
وگر نه میشه n تا ایرا به توضیحات بالا گرفت.اما هیچ کدوم ربطی به موضوع مورد بحث ما نداره
مثلا نکته دیگه ای که میشه در نظر گرفت اینه که در مثال اول که از Constructor استفاده شده، م مقدار را به Constructor فرستدم، بهتر بود که یک Constructor دیگه برای کلاس تعریف می کردم با مقدار پیش فرض و از فراخوانی constructor ها توسط هم استفاده می کردم که برای نمونه گیری از فرم 2 حتما نیاز نباشه که پارامتر به اون پاس کنیم. یعنی انعطاف پذیری بیشتر.اما همانطور که گفتم این نکات هیچ ربطی به مبحث مورد نظر نداشت
اما جا داره از شما به خاطر توجهتون به این نکته تشکر کنم
دوستان هم خوبه که به این جور نکات توجه داشته باشن
موفق باشید

----------


## اَرژنگ

اتفاقا نه! نمیشه n تا ایراد به این مقاله گرفت! ولی همیشه میشه یک نکاتی را بهش اضافه کنیم یا به توجه بیاریم که وقتی که کسی میخواد تکمیلترش کند ازشان استفاده کند.

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

در ضمن نمیشه که از نویسنده مقاله انتظار داشت که تمام جوانب فرعی، درجه دوم، جوانب جانبی... را در نظر بگیرد، خوب درسته که یکی زحمت کشیده اصل مطلب را نوشته، ما هم از کنار به اینکه چه چیزهایه دیگری را میشه به مقاله اضافه کرد و یا مطالب جانبی را که ممکنه به نظر جالب بیاند را اضافه کنیم. یعنی یک چیزی مانند مقاله نویسی اوپن سورس! 

اگر واقعا میتونتستم به این مقاله یک اشکال بگیرم خودم یک مقاله مینوشتم ! وگرنه همیشه میشه n تا نکات را به عرض توجه نویسنده آورد. اگر به کتابهایه سطح بالا نگاه بندازید میبینید که یک نویسنده دارد و ۲۰ تا ایراد گیر! حالا اگر به نظر نویسنده نکته جالب بود و میارزید، قاطی کتابش میکند اگر هم که نه متن اصلی همان میماند ولی بقیه هم روش یکمی نظرسنجی میکنند.

من میگم همین پست شما را باید جزو اعلانات این انجمن کنیم، چونکه من هم مثل شما از سوالات و جوابات تکراری اشتباه دسترسی مستقیم به ابجکتها  خسته‌ام. 
اگر هم گاهگاهی حال نوشتن را داشتید مرورش میکنید.

----------


## Mahdi.Kiani

سلام به همه عزیزان و عرض تسلیت مجدد به مناسبت این ایام
چند روز پیش تاپیکی با عنوان کنترل کردن فرم ها و آبجکت ها توسط یکدیگر و دسترسی آن ها به هم در اینجا مطرح شد. که من کمی توضیح در این باره داده بودم (در پست 11)

قرار بود که مطالب را کامل کنم و در قالب یک مقاله در اختیار دوستان قرار بدهم. اما چون فرصت نداشتم، قصد داشتم این موضوع را و چند مقاله دیگر از جمله ادامه  MVC و ... را حداقل تا بعد از امتحان ارشد به تعویق بیاندازم. اما با توجه سیل عظیم ایمیل ها و درخواست ها مبنی بر کامل کردن این موضوع، امروز مجبور شدم یکمی از وقتم را به این موضوع اختصاص بدم
مقاله ای هر چند ناقص به هکراه چند مثال تهیه کردم که امیدوارم دوستان بهره کافی ازش بتونن ببرن
چون خیلی سریع مجبور شدم  مقاله را تایپ کنم، غلط املایی و اشتباهات لپی زیادی ممکن است در مقاله به چشم بخورد که از این بابت پوزش می طلبم
دوستان دقت کنند که در نوشتن مثال ها وسواس به خرج ندادم. مثلا استفاده نکردن از توضیحات کافی و خیلی موارد دیگه...اون هم فقط و فقط به دلیل کمبود وقت
الانم خفن دیرم شده ...باید برم سر قرار  :لبخند گشاده!:  (چیه بابا این قرار از نوع خوبشه..چرا تهمت الکی میزنین  :لبخند گشاده!: )که اگه نرم کلمو می کنن

اسم درست فایل Attach شده هم باید Objectsrelation (ارتباط آبجکت ها)باشه که اشتباها ObjectRelations (ارتباط های آبجکت) نوشته شده  :اشتباه: 
یه نتکته ای هم در مورد مثال آخر دارم که چون الان فرصت نیست، اومدم می گم چیه 
کوچیک همه شما
کیانی

----------


## خانم گل

سلام. اول بگم که خیلی عالی بود . اگه میشد یه بار دیگه تشکر می کردم. انشااله امتحان فوق رو هردومون خوب بدیم.
حالا یه سوال دارم . توی حالت دوم یعنی ارسال از فرم دوم به فرم اول ، فرم دوم رو showdialog می کنم اما نمی خوام از هیچ دکمه ای توی فرم دوم استفاده کنم. واضحتر بگم : وقتی از فرم اول روی یه textbox کلیک کردم واسم یه لیست توی فرم دیگه باز میشه که showdialog کردم. با کلیک روی هر کدوم از آیتمهای لیست می خوام لیست بسته بشه و آیتم مورد نظرم به textbox از فرم اول اضافه بشه حالا باید چیکار کنم؟

----------


## Mahdi.Kiani

> سلام. اول بگم که خیلی عالی بود . اگه میشد یه بار دیگه تشکر می کردم. انشااله امتحان فوق رو هردومون خوب بدیم.
> حالا یه سوال دارم . توی حالت دوم یعنی ارسال از فرم دوم به فرم اول ، فرم دوم رو showdialog می کنم اما نمی خوام از هیچ دکمه ای توی فرم دوم استفاده کنم. واضحتر بگم : وقتی از فرم اول روی یه textbox کلیک کردم واسم یه لیست توی فرم دیگه باز میشه که showdialog کردم. با کلیک روی هر کدوم از آیتمهای لیست می خوام لیست بسته بشه و آیتم مورد نظرم به textbox از فرم اول اضافه بشه حالا باید چیکار کنم؟


سلام
خواهش می کنم
فکر کنم شما می خواین یه کاری شبیه به کاری که نرم افزار هلو انجام داده (برای انتخاب از لیست) انجام بدین
دقت کنید که برای dialog کردن فرم حتما نیاز نیست که دکمه ای با خاصیت dialogResult داشته باشین
شما می تونین به طور دستی مقدار dialogresult را برای فرم تنظیم کنید مانند کدی زیر



 this.DialogResult = DialogResult.OK;



کنترل برنامه وقتی به خط فوق برسه فرم را اتوماتیک می بنده

نکته دیگه اینکه برای باز کردن فرم مربوط به لیست داده ها، استفاده از رویداد کلیک برای textbox جالب به نظر نمی رسه .معمولا یه shoertcut مثل F2 و ... تنظیم می کنند یا اینکه بعضا در رویداد KeyPreess یا keydown مربوط به textbox ، فرم لیست داده ها را show می کنند
به نظر من استفاده ازF2 و نظیر آن بهتر است

دو نمونه برنامه براتون میفرستم. برای نمونه ببینید ولی بهینه کردنش با خودتون
اولی بدون استفاده از dialogresult و دومی با استفاده از dialogrsult 
موفق باشید

----------


## x125x125

باید یه grid تعریف کنی و اون رو تبدیل به پراپرتی کنی و با استفاده از اون ارتباط برقرار کنی راه دوم که البته خودم هم مطمئن نیستم اینکه متد رو Static تعریف کنی .

----------


## khoshtip118

همون طور كه يكي از دوستان گفته بود با static كردن متغيير
يه نمونه گذاشتم

----------


## x125x125

> همون طور كه يكي از دوستان گفته بود با static كردن متغيير
> يه نمونه گذاشتم


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

----------


## Mahdi.Kiani

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





> همون طور كه يكي از دوستان گفته بود با static كردن متغيير
> يه نمونه گذاشتم





> باید یه grid تعریف کنی و اون رو تبدیل به پراپرتی کنی و با استفاده از اون ارتباط برقرار کنی راه دوم که البته خودم هم مطمئن نیستم اینکه متد رو Static تعریف کنی .


https://barnamenevis.org/showpo...9&postcount=28

https://barnamenevis.org/showpo...6&postcount=32


این مقاله فارسی را هم بخونید

موفق باشید

----------


## robat7

آقاي كياني
ممنون از راهنمايي شما
ولي وقتي من مطابق راهنمايي شما عمل مي كنم از فرم نخست هيچكدام از پراپرتي هاي فرم 2 را نمي بينم

Form GetD = new FrmCPSelector(MyCP_ConnectionString_str,
                    "SELECT ORG_ID, ORG_NAME, ACTIVE_FL FROM ORG WHERE ACTIVE_FL = 'Y' ",
                    "org",
                    "Select Organization", 2,
                    "ID", "ORG_ID", "Organization", "ORG_NAME", 1, true);
if (GetD.ShowDialog() == DialogResult.OK)
{
    Organization_ID = GetD.NewVal1Id
    Organization_title_ID = GetD.NewVal2_Id;
}

متغيرهاي فرم 2

String NewVal1_str = String.Empty;
String NewVal2_str = String.Empty;

خاصيت هاي فرم 2

publicString NewVal1_Id
{
    set { NewVal1_str = value; }
    get { return NewVal1_str; }
}
publicString NewVal2_Id
{
    set { NewVal2_str = value; }
    get { return NewVal2_str; }
}

همانطور كه در تصوير پيوست ملاحظه مي فرماييد خاصيت ها در ليست نيستند ممكن است راهنمايي بفرماييد

----------


## robat7

مشكل حل شد

using (FrmCPSelector GetD = newFrmCPSelector(MyCP_ConnectionString_str,
        "SELECT ORG_ID, ORG_NAME, ACTIVE_FL FROM ORG WHERE ACTIVE_FL = 'Y' ",
        "org",
        "Select Organization", 2,
        "ID", "ORG_ID", "Organization", "ORG_NAME", 1, true))
{
    if (GetD.ShowDialog() == DialogResult.OK)
    {
        // Organization_ID = GetD.
        Organization_title_ID = GetD.NewVal2_Id;
        Organization_ID = GetD.NewVal1_Id;
    }
}// using

با تشكر از كتاب آقاي هاشميان

----------


## shocraneh

اینقدر آقای کیانی لطف کرده بود که نتونستم فقط رو دکمه تشکر کلیک کنم . آقا واقعا دستتون درد نکنه . در پناه حق موفق باشید

----------


## farzad_1354

سلام به همه دوستان 


یه سوال داشتم که نمیدونم به این بخش مربوط میشه یا نه 


میخوام یه چیزی شبیه Subform  توی فرم اصلی ایجاد کنم ، چطور میشه 
مثلا  فرض کنید فرم اول شامل اطلاعات یه فرد باشه و فرم زیر مجموعه یا Subform  شامل اطلاعات تحت تکفل این فرد باشه با یه جستجو ، یه چیزی شبیه اکسس

----------

