PDA

View Full Version : تغییر عنوان فرم 1 از طریق فرم 2



hamide_kh
چهارشنبه 05 خرداد 1389, 13:31 عصر
با عرض سلام خدمت دوستان
من در برنامه هام 2 تا فرم دارم در فرم دومم می خوام با زدن یک دکمه caption فرم اولم تغییر کنه
برای این کار کد زیر را نوشتم
form1 frm=new form1();
frm.text=Txtbox1.text;
اما این کد عمل نمی کنه
البته اگه کد زیر را بنویسم و یک نمونه جدید از فرم یک بسازم عمل میکنه
frm.visible=false;
frm.visible=true;
اما من می خوام همون فرم قبلی را تغییر بدم
اگه ممکنه راهنماییم کنید

ASKaffash
چهارشنبه 05 خرداد 1389, 14:50 عصر
سلام
اگر در مثال پائین امنیت در فرم 9 برایتان مهم نیست اینطوری عمل کنید :
در فرم 9 :


new Form10(this).Show();

در فرم 10 :


public partial class Form10 : Form
{
public Form9 F9 { set; get; }
public Form10(Form9 F9)
{
InitializeComponent();
this.F9 = F9;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
this.F9.Text = this.textBox1.Text;
}
}

hamide_kh
پنج شنبه 06 خرداد 1389, 00:14 صبح
با عرض سلام و تشکر از پاسختون

سلام
اگر در مثال پائین امنیت در فرم 9 برایتان مهم نیست اینطوری عمل کنید :

2 تا سوال برام پیش اومد:
1-میشه در باره اینکه امنیت برام مهم نیست بیشتر توضیح بدید
2-اگه ممکنه یکم در مورد کد هم بهم توضیح بدید

ASKaffash
شنبه 08 خرداد 1389, 08:58 صبح
سلام
اشکال این روش این است که فرم 10 کاملا به تمام اشیای درون فرم 9 دسترسی دارد
در این برنامه برای نمونه ساخته شده در فرم 10 ریفرنس فرم 9 ارسال می شود (در یک خاصیت از نوع فرم 9) و به این روش مدیریت فرم 9 در اختیار فرم 10 نیز قرار می گیرد

Amir Oveisi
شنبه 08 خرداد 1389, 13:30 عصر
با عرض سلام خدمت دوستان
من در برنامه هام 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 استفاده کنیم.

امیدوارم توضیحات مفید واقغ بشن.
موفق باشید

mohammad kafiyan
پنج شنبه 30 آذر 1391, 00:09 صبح
با سلام به دوستان
Application.OpenForms["form1"].Text = "hello";
از نمونه کد بالا برای تغییر نام فرم 1 از طریق فرم 2 استفاده کردم و به درستی جواب گرفتم ولی زمانی که می خواهم به شی از فرم1 مثل button دسترسی پیدا کنم با کد زیر

(Application.OpenForms["client"] as client).Controls["btn_about"].Enabled = true;
این خطا را می دهد و
Object reference not set to an instance of an object.(نمونه از شی نمی تواند بروی شی مرجع تنظیم کند )
چرا؟؟؟؟؟؟؟؟؟؟؟:متعجب::عصبا ی:

Amir Oveisi
پنج شنبه 30 آذر 1391, 12:40 عصر
btn_about ای که دارید new شده آیا؟
مطمئنید که اسمش رو درست نوشتید؟

mohammad kafiyan
پنج شنبه 30 آذر 1391, 23:01 عصر
btn_about ای که دارید new شده آیا؟

بیشتر توضیح دهید منظور شما چیست از new کردن


مطمئنید که اسمش رو درست نوشتید؟

بله درست نوشتم مشکلی از این نیست
در پنجره about خروجی دستوری که در پست قبل نوشتم را برابر null می کنه و همان خطای بالا را می دهد
چرا؟؟؟؟؟؟؟؟