نوشته شده توسط
hamide_kh
با عرض سلام خدمت دوستان
من در برنامه هام 2 تا فرم دارم در فرم دومم می خوام با زدن یک دکمه caption فرم اولم تغییر کنه
برای این کار کد زیر را نوشتم
form1 frm=new form1();
frm.text=Txtbox1.text;
اما این کد عمل نمی کنه
البته اگه کد زیر را بنویسم و یک نمونه جدید از فرم یک بسازم عمل میکنه
frm.visible=false;
frm.visible=true;
اما من می خوام همون فرم قبلی را تغییر بدم
اگه ممکنه راهنماییم کنید
دوست عزیز این بحث ده ها بار در سایت مطرح شده که چطور از طریق یک فرم به کنترل های فرم دیگه دسترسی داشته باشیم و یا مقادیر فیلدهایی از فرم دیگه رو تغییر بدیم و از این چیزا. و شما اگر جستجو می کردید قبل از ایجاد تاپیک، مطمئنا به جواب می رسیدید.
و اما در مورد سوالتون:
هر فرمی وفتی show میشه و روی صفحه نشون داده میشه، در وافع یک شی هست از نوع اون فرم که new شده و الان در حافظه قرار داره. فرض کنید که شما دو تا فرم رو show کردین، form1 از نوع Form1 و form2 از نوع Form2. پس الان این دو تا object در حافظه قرار دارند. شما اگر بخواهید که از فرم مثلا دوم به text (یا به قول شما caption - اگه اشتباه نکنم تو VB میگفتن caption) فرم اول دسترسی داشته باشید باید به یک نحوی به همون شی موجود در حافظه دسترسی پیدا کنید. کد هایی که شما نوشتید میاد و یک شی جدید از فرم اول می سازه و text اونو تغییر میده واسه همین چون شی قبلی که تو حافظه بود تغییری نکرده، پس فرم یک شما هم تغییری نمیکنه.
برای حل این مسئله دوستان روش های مختلفی رو تو پست های مختلف پیشنهاد دادن که متاسفانه خیلی هاشون روش های درستی نیستند.
بهترین راه و درست ترین راه برای انجام کاری که شما میخواید، استفاده از یک property هست به نام OpenForms در کلاس Application. این property به عنوان کلید یک int می گیره. مثلا اگر بهش 0 بدید یعنی اولین فرمی که باز شده رو برگردون. (دقت کنید که فرم ها به ترتیب show شدن میرن داخل این OpenForms ، درست مثل یک صف).
یک حالت دیگه از property هم یک string به عنوان کلید می گیره و فرمی رو که نام اون با کلید برابر هست رو از میان فرم های باز، بر میگردونه.
به این مثال دقت کنید:
در فرم دوم می نویسیم:
Application.OpenForms[0].Text = "hello";
کد بالا اولین فرم باز برنامه رو برمی گردونه (که همون فرم 1 ما میشه) و ما مقدار Text اش رو تغییر میدیم.
با فرض اینکه مقدار Name فرم 1 ما form1 باشه، کد بالا رو این شکلی هم میشه نوشت:
Application.OpenForms["form1"].Text = "hello";
نکته:
Application.OpenForms یک شی از نوع کلاس پایه Form بر می گردونه. مثلا در مثال بالا که فرم صفرام همون فرم 1 ما هست، اما نوع داده ای که برگشت داده میشه از نوع فرم1 ما نیست بلکه از نوع کلاس پایه Form هست. اگر بخواهید که داده برگشت داده شده از نوه داده فرم خودتان باشد (در اینجا از نوع Form1) باید از Catsting استفاده کنید. به کد زیر دقت کنید:
(Application.OpenForms["form1"] as Form1).Controls["textbox1"] .Text = "some new text";
در این کد ما فرم برگشت داده شده رو تبدیل کردیم به Form1 (چون در واقع همون فرم 1 بود اما نوع داده اش Form1 نبود و ما درستش کردیم) و از اون استفاده کردیم.
دقت کنید در این کد برای دسترسی به کنترل textbox داخل فرم1، از یک property به اسم Controls استفاده کردیم که طرز کار با آن دقیقا مانند OpenForms هست و با دادن اسم یک کنترل، اونو بهمون بر میگردونه. بدون این روش ما نمیتونیم به کنترل های دسترسی داشته باشیم چون private هستن و غیرقابل دسترسی مستقیم.
Controls هم نوغ داده برگشتیش از نوع خود اون کنترل نیست بلکه از نوع کلاس پایه Control هست. مثلا تو کد ما، textbox رو خواستیم بگیریم، درسته textbox رو بهمون میده اما نوع داده اش TextBox نیست و Control (که TextBox از اون ارث برده) هست. اگر لازم بود که نوع داده برگشتیمون TextBox باشه باید مثل فرم ها از Casting استفاده کنیم.
امیدوارم توضیحات مفید واقغ بشن.
موفق باشید