PDA

View Full Version : نحوه ی ارتباط و پاس كردن مقادير ميان چند فرم ويندوز



محمد مومنی
شنبه 19 شهریور 1384, 00:23 صبح
میخوام بین کنترلها توی فرمهای مختلف ارتباط برقرار کنم.مثلا چطوری میتونم محتویات یه textbox در یه فرم رو در یه textbox توی یه فرم دیگه چاپ کنم.
لطفا راهنمایی کنید.متشکرم.

Panje Tala
شنبه 19 شهریور 1384, 13:34 عصر
با سلام
اصلا نیازی به استفاده از بانک نیست. شما میخواهید فرم شما یک یا چند پارامتر را به فرم بعدی پاس کند برای این کار باید 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
سه شنبه 09 اسفند 1384, 12:51 عصر
سلام،
میدونم سوال تکراریه ولی تو جوابها هنوز روش مشخصی ارائه نشده
تو فرم یه grid وجود داره که وقتی سطری انتخاب میشه با زدن کلیدی یه فرم جدید باز میشه و اطلاعات کاملتر او سطر رو تو فرم باز شده جدید نشون میده حالا چطوری مقدار کلید ردیف grid انتخابی رو به فرم جدید پاس کنم

mehranFX
سه شنبه 09 اسفند 1384, 14:28 عصر
سلام،
میدونم سوال تکراریه ولی تو جوابها هنوز روش مشخصی ارائه نشده
تو فرم یه grid وجود داره که وقتی سطری انتخاب میشه با زدن کلیدی یه فرم جدید باز میشه و اطلاعات کاملتر او سطر رو تو فرم باز شده جدید نشون میده حالا چطوری مقدار کلید ردیف grid انتخابی رو به فرم جدید پاس کنم
در کلاس مربوط به فرم دوم ات یک متغیر تعریف کن و در فرم اول قبل از تشکیل شیء نمونه از کلاس فرم دوم جهت نمایش بر روی مونیتور ، مقدار این متغیر رو نیز Set کن!

ali_kolahdoozan
سه شنبه 09 اسفند 1384, 18:16 عصر
modifyers اون شئی رو public کن (درون property حل می شه

Mehdi Asgari
سه شنبه 09 اسفند 1384, 23:00 عصر
سازندۀ فرم دوم رو طوری تغییر بده که یک متغیر (از هر نوعی که میخوای) رو به عنوان پارامتر بگیره ، بعد در هنگام ایجاد یک شی جدید از فرم دوم ، اون مقداری رو که میخوای انتقال بدی ، به عنوان پارامتر سازنده منتقل کن.

hmm
چهارشنبه 10 اسفند 1384, 07:21 صبح
سازندۀ فرم دوم رو طوری تغییر بده که یک متغیر (از هر نوعی که میخوای) رو به عنوان پارامتر بگیره ، بعد در هنگام ایجاد یک شی جدید از فرم دوم ، اون مقداری رو که میخوای انتقال بدی ، به عنوان پارامتر سازنده منتقل کن.


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

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

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

hmm
شنبه 13 اسفند 1384, 07:48 صبح
سلام؛
ببین "سید" سوالی کردم جوابش رو دادی ازت ممنونم ولی...
لازم نیست تعداد پروژه های که با دات نت نوشتم رو بگم ولی میتونی به پاسخ حقیر که به سوالات بعضی از دوستان دادم توجه کنی

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

ولی هدف من از طرح این سوال و این (http://www.barnamenevis.org/forum/showthread.php?t=39690) سوال و این (http://www.barnamenevis.org/forum/showthread.php?t=39689) سوال این بود که بدونم چقدر افراد این بخش تونستن مفاهیم ابتدایی دات نت رو بفهمند و اگه عمری بود تا آخر ماه یه جمع بندی کلی خدمت اعضا میدم .
بهرحال سعی کن یا لطف کنی و به سوالات بقیه با کمال ادب جواب بدی یا لطف کن و اصلا جواب نده!
واژه های بکار گرفته توسط شما و بیشتر mehranFX (http://www.barnamenevis.org/forum/member.php?u=7287) جوبه ولی بدرد کسی که اول راه دات نته نمیخوره خواستم تو پست قبلیم اینو بصورت غیر مشهود بگم که این شیوه پاسخ برای هم رده ها خوبه نه برای مبتدیها !
بهرحال از پاسخت ممنون

alirezador
دوشنبه 22 اسفند 1384, 17:59 عصر
سلام من میخواستم بدونم که چطوری بدون استفاده از متد show() یک مقدار را به فرم دوم میفرستید و چطوری فرم را نمایش میدهید؟

habedijoo
سه شنبه 23 اسفند 1384, 12:02 عصر
سلام
یه مثال خیلی ساده برات گذاشتم . امیدوارم منظورت همین باشه .

mahani
جمعه 20 مرداد 1385, 16:28 عصر
ببخشید اگر این سوال کمی تکراری است ولی من هنوز جواب مشخصی برای آن پیدا نکردم
فرض؟ فرم١ در ابتدای برنامه اجرا میشود و فرمهای٢و٣ توسط فرم١ باز میشوند و مسلما فرم١ به فرمهای٢و٣ دسترسی دارد
سوال؟ فرم٢ چگونه میتواند به فرمهای١و٣ دسترسی داشته باشد


static void Main()
{
Application.Run(new Form1());
}


private void Form1_Load(object sender, EventArgs e)
{
Form2 form2 = new Form2();
Form3 form3 = new Form3();
form2.Show();
form3.Show();
}

محمد میرمصطفی
شنبه 21 مرداد 1385, 14:48 عصر
public static Form1 MainForm;
static void Main()
{
MainForm = new Form1();
Application.Run(MainForm);
}


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

hamid_isf_1360
چهارشنبه 02 خرداد 1386, 12:19 عصر
ابتدا یک کلاس به برنامه اضافه می کنید مثلا به نام 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
چهارشنبه 02 خرداد 1386, 13:48 عصر
به به !
میشه بگید چه لزومی داره به همه فرم ها اون هم اینطوری دسترسی داشته باشیم ؟

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

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

kiani.mehdi
چهارشنبه 02 خرداد 1386, 17:35 عصر
ابتدا یک کلاس به برنامه اضافه می کنید مثلا به نام myConfig بعدش فرض کنید در برنامتون 100 تا فرم دارید که می خواهید از آخری به اولی و از اولی به آخری پارامتر پاس کنید یا هر کاری که دلتون خواست را انجام بدید مثلا از فرم آخری فرم اولی را مینیمایز کنید.



حال داخل کلاسی که ساختید به تعداد فرم هاتون متغیری استاتیک از نوع آن فرم بسازید به شکل زیر

public static f1 Form1;

و برای فرم های بعدی هم به همین صورت مثلا

public static f100 Form100;

حالا هرجا خواستید یکی از فرم ها را از داخل یه فرم دیگه ظاهر کنید کد زیر را بنویسید
مثلا

Config.f1 = new Form1();
Config.f1.Show();

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

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

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


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

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

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

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

hamid_isf_1360
چهارشنبه 02 خرداد 1386, 23:35 عصر
بسم رب العشق

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

یا علی

Sorenaa_s
پنج شنبه 03 خرداد 1386, 00:04 صبح
بسم رب العشق

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

یا علی

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

Alireza_Salehi
پنج شنبه 03 خرداد 1386, 05:45 صبح
بسم رب العشق

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

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

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

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

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

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

omid_Ahmadi
پنج شنبه 03 خرداد 1386, 09:06 صبح
@ hamid_isf_1360 (http://barnamenevis.org/forum/member.php?u=28083):

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

موفق باشید.

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

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

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


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



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


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

hassan razavi
شنبه 15 دی 1386, 18:27 عصر
می تونید یک متد Public در فرمتون بسازید که با صدا زدن آن ، کار مورد نظرتون رو براتون انجام بده.

hassan razavi
شنبه 15 دی 1386, 21:04 عصر
باتشکر از night_fall2 عزیز و فعال
با استفاده ازز Singleton Pattern می تونید به منظورتون برسید. از لینک زیر کمک بگیرید
http://barnamenevis.org/forum/showthread.php?t=84947&highlight=singleton

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

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

sinpin
دوشنبه 17 دی 1386, 21:38 عصر
این لینک رو هم ببینید :
http://barnamenevis.org/forum/showthread.php?p=446800

Mahdi.Kiani
دوشنبه 17 دی 1386, 21:53 عصر
من هم یه همچین مشکلی دارم ،ممنون میشم راهنمایی کنید .
دلیل اینکه می خوام اینکار رو بکنم:
من در یه فرمم یه 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 بایستی فهمیده باشن که چگونه باید مشکلشون را حل کنند

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

موفق باشید

اَرژنگ
سه شنبه 18 دی 1386, 14:42 عصر
یک نکته:
PassedParameter برایه نامگذاری پروپرتی درست نیست. طرز تفکر نباید به این باشد که از بیرون چی آمده، ایده انکپسولیشن این است که محلی فکر کنیم.
به جایه PassedParameter ، نامه پروپرتی باید برایه کلاس معنی بده، اسمه بهتر MessageText و یا هر چیزه دیگری که برایه کلاس معنی دارد بهتر است.

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

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

Mahdi.Kiani
سه شنبه 18 دی 1386, 16:45 عصر
یک نکته:
PassedParameter برایه نامگذاری پروپرتی درست نیست. طرز تفکر نباید به این باشد که از بیرون چی آمده، ایده انکپسولیشن این است که محلی فکر کنیم.
به جایه PassedParameter ، نامه پروپرتی باید برایه کلاس معنی بده، اسمه بهتر MessageText و یا هر چیزه دیگری که برایه کلاس معنی دارد بهتر است.

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

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

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

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

اَرژنگ
سه شنبه 18 دی 1386, 17:19 عصر
اتفاقا نه! نمیشه n تا ایراد به این مقاله گرفت! ولی همیشه میشه یک نکاتی را بهش اضافه کنیم یا به توجه بیاریم که وقتی که کسی میخواد تکمیلترش کند ازشان استفاده کند.

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

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

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

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

Mahdi.Kiani
یک شنبه 23 دی 1386, 17:14 عصر
سلام به همه عزیزان و عرض تسلیت مجدد به مناسبت این ایام
چند روز پیش تاپیکی با عنوان کنترل کردن فرم ها و آبجکت ها توسط یکدیگر و دسترسی آن ها به هم در اینجا (http://barnamenevis.org/forum/showpost.php?p=446809&postcount=40) مطرح شد. که من کمی توضیح در این باره داده بودم (در پست 11)

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

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

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

Mahdi.Kiani
دوشنبه 24 دی 1386, 11:58 صبح
سلام. اول بگم که خیلی عالی بود . اگه میشد یه بار دیگه تشکر می کردم. انشااله امتحان فوق رو هردومون خوب بدیم.
حالا یه سوال دارم . توی حالت دوم یعنی ارسال از فرم دوم به فرم اول ، فرم دوم رو showdialog می کنم اما نمی خوام از هیچ دکمه ای توی فرم دوم استفاده کنم. واضحتر بگم : وقتی از فرم اول روی یه textbox کلیک کردم واسم یه لیست توی فرم دیگه باز میشه که showdialog کردم. با کلیک روی هر کدوم از آیتمهای لیست می خوام لیست بسته بشه و آیتم مورد نظرم به textbox از فرم اول اضافه بشه حالا باید چیکار کنم؟

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




this.DialogResult = DialogResult.OK;



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

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

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

x125x125
پنج شنبه 23 خرداد 1387, 14:54 عصر
باید یه grid تعریف کنی و اون رو تبدیل به پراپرتی کنی و با استفاده از اون ارتباط برقرار کنی راه دوم که البته خودم هم مطمئن نیستم اینکه متد رو Static تعریف کنی .

khoshtip118
پنج شنبه 23 خرداد 1387, 18:35 عصر
همون طور كه يكي از دوستان گفته بود با static كردن متغيير
يه نمونه گذاشتم

x125x125
جمعه 24 خرداد 1387, 20:35 عصر
همون طور كه يكي از دوستان گفته بود با static كردن متغيير
يه نمونه گذاشتم

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

Mahdi.Kiani
پنج شنبه 30 خرداد 1387, 01:14 صبح
اینم کامل شده ی برنامه ی این دوستمون


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


باید یه grid تعریف کنی و اون رو تبدیل به پراپرتی کنی و با استفاده از اون ارتباط برقرار کنی راه دوم که البته خودم هم مطمئن نیستم اینکه متد رو Static تعریف کنی .
http://barnamenevis.org/forum/showpost.php?p=446809&postcount=28

http://barnamenevis.org/forum/showpost.php?p=449646&postcount=32


این مقاله فارسی را هم بخونید (http://barnamenevis.org/forum/attachment.php?attachmentid=13638&d=1200233621)

موفق باشید

robat7
سه شنبه 21 اردیبهشت 1389, 22:08 عصر
آقاي كياني
ممنون از راهنمايي شما
ولي وقتي من مطابق راهنمايي شما عمل مي كنم از فرم نخست هيچكدام از پراپرتي هاي فرم 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
سه شنبه 21 اردیبهشت 1389, 22:32 عصر
مشكل حل شد

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
چهارشنبه 26 مرداد 1390, 18:21 عصر
اینقدر آقای کیانی لطف کرده بود که نتونستم فقط رو دکمه تشکر کلیک کنم . آقا واقعا دستتون درد نکنه . در پناه حق موفق باشید

farzad_1354
سه شنبه 01 بهمن 1392, 14:59 عصر
سلام به همه دوستان


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


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