PDA

View Full Version : سوال: راهی برای پاس دادن مقدار متغیر از فرم فرزند به فرم مادر



سمانه علوی فر
سه شنبه 13 اردیبهشت 1390, 11:54 صبح
فرض کنید یک فرم داریم(فرم 1) که با کلیک یک دکمه فرم دیگری(فرم 2) را باز می کند.
چه راهی برای پاس دادن مقدار یک متغیر از فرم2 به فرم 1 وجود دارد؟ یعنی Pass message back to Parent؟

یکی از این راهها استفاده از property می باشد ولی مشکل این جاست که ما می خواهیم فرم دوم را جاهای دیگری از پروژه صدا کنیم و لذا پراپرتی ما محدود می کند
آیا راه دیگری سراغ دارید؟؟

tooraj_azizi_1035
سه شنبه 13 اردیبهشت 1390, 13:16 عصر
سلام،
با فرض اینکه متغیر مورد نظر یکی از فیلدهای کلاس فرم 1 است برای اینکه این فیلد توسط جهان خارج از کلاس فرم 1 قابل دستیابی باشد باید از public access modifier استفاده کنید یعنی قبل از نوع فیلد کلمه کلیدی public را قرار دهید.:قلب:

haghft
سه شنبه 13 اردیبهشت 1390, 15:12 عصر
ببین این نمونه ها بدرد میخوره.اگه بدرد خورد دعام کن.

سمانه علوی فر
سه شنبه 13 اردیبهشت 1390, 15:25 عصر
ببین این نمونه ها بدرد میخوره.اگه بدرد خورد دعام کن.

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


صورت سوال اینه که فرض کنید رو دکمه در داخل گرید کلیک می کنید سپس تو یه فرم جدید (فرم 2) یه لیست براتون باز میشه (این لیست هم در گرید باز می شه)
حالا یک سطر رو از لیست انتخاب می کنید و مقدار انتخابیتون باید در یک خانه از گرید فرم 1 قرار بگیره
مشکل اینجاست که مقدار رو من برگردوندم به فرم یک ولی نمی دونم چه طوری به محض اینکه فرم 2 unload میشه اون باید در گرید بشینه؟
کجا باید این کد رو بنویسم؟
میشه راهنمایی کنید؟

daivid_ d31r1
چهارشنبه 14 اردیبهشت 1390, 10:15 صبح
سلام دوست من
وقتي فرم 2 رو از طريق فرم 1 باز ميكني و اطلاعات رو به اون فرم پاس ميدين(در صورتي كه از showdialog استفاده كرده باشي)و كاراتونو انجام ميدين و ميخاين فرم 2 رو ببنيدن پراپرتي هاي اون هنوز تو حافظه هستن و شما ميتونيد از اين طريق به اونا دسترسي داشته باشيد


form2 form=new form2();

form.prop1=x;

form.showdialog()

x=form.prop1;

شايد راهي باشد بهتر از اين
====================================
در همه دير مغان نيست چو من شيدايي
خرقه جايي گرو باده و دفتر جايي

سمانه علوی فر
چهارشنبه 14 اردیبهشت 1390, 12:45 عصر
سلام دوست من
وقتي فرم 2 رو از طريق فرم 1 باز ميكني و اطلاعات رو به اون فرم پاس ميدين(در صورتي كه از showdialog استفاده كرده باشي)و كاراتونو انجام ميدين و ميخاين فرم 2 رو ببنيدن پراپرتي هاي اون هنوز تو حافظه هستن و شما ميتونيد از اين طريق به اونا دسترسي داشته باشيد


form2 form=new form2();

form.prop1=x;

form.showdialog()

x=form.prop1;

شايد راهي باشد بهتر از اين
====================================
در همه دير مغان نيست چو من شيدايي
خرقه جايي گرو باده و دفتر جايي


حالا این کاملا درسته
شما فرض کن این راه رو رفتم و وقتی که این خط اجرا شد


x=form.prop1;

فرم دوم را هم می بندم
به این صورت:


x=form.prop1;
form.close();


حالا دقیقا به اون چیزی که می خوام رسیده ام ولی مشکل این جاست که اگه دوباره بخوام رو همین دکمه کلیک کنم و دوباره این فرم پاپ آپ رو باز کنم به مشکل می خوره؟!!
راهی سراغ دارید برای حل این مشکل؟

سمانه علوی فر
چهارشنبه 14 اردیبهشت 1390, 12:53 عصر
FrmBase_PopUp frm = new FrmBase_PopUp();


private void btn_OK_Click(object sender, EventArgs e)
{

textBox1.Text = frm.dgv_Info.CurrentRow.Cells[0].Value.ToString();
frm.Close();

}


private void button1_Click(object sender, EventArgs e)
{



frm.Text = "my search form results";


frm.btn_OK.Click += new System.EventHandler(btn_OK_Click);
frm.Show();
textBox1.Text = frm.dgv_Info.CurrentRow.Cells[0].Value.ToString();

}



کد به این صورت هست و مشکل این جاست که وقتی دکمه ok کلیک می شود و آنلود می شود بار دوم نمی توانم آن فرم را باز کنم
ایرادی هم که میده این هست:



Cannot access a disposed object.
Object name: 'FrmBase_PopUp'.

سمانه علوی فر
یک شنبه 18 اردیبهشت 1390, 08:11 صبح
میشه یک نفر به این سوال جواب بده لطفا؟

haghft
یک شنبه 18 اردیبهشت 1390, 08:40 صبح
شما از این کد به جای frm.close(); استفاده کن ببین مشکلت حل میشه
frm.Hide();

سمانه علوی فر
یک شنبه 18 اردیبهشت 1390, 08:47 صبح
شما از این کد به جای frm.close(); استفاده کن ببین مشکلت حل میشه
frm.Hide();

نه حل نمی شه
فرم پنهان نمی شه
از کد زیر استفاده کردم


frm.Visible = false;

ولی آیا با توجه به صورت مسئله این روش منطقیه؟
پیشنهادی ندارید برای بهبود؟

PetekDincos
یک شنبه 18 اردیبهشت 1390, 09:45 صبح
با سلام
من با Win App یکی دو بار اون هم چند سال قبل کار کردم و الان هیچی از این محیط نمیدونم و چند سالی که WPF کار می کنم من روش کار با دیتاگراید رو تو WPF می گم شما خودت تبدیل به Win App بکن
برای کار با دیتاگراید به این صورت که کاربر بتونه تو سطرهای دیتاگراید از فرم های دیگه (از لیست و جدول های ذیگر) مقدار وارد بکنه بعد از اینکه شما دیتاگرایدت رو بایند کردی بایستی دیتاگراید بایند شده ات رو با یه ListCollectionView مرتبط بکنی به این صورت



List<MyClass> List = new List<MyClass>();
DataGrid1.ItemsSource = List;
ListCollectionView View = (ListCollectionView)((CollectionViewSource.GetDefa ultView(this.DataGrid1.ItemsSource)));



که در کد بالا من یک جدول (کلاس) به نام MyClass دارم و یک لیست از این کلاس(جدولم) تشکیل می دم و به دیتاگرایدم بایند می کنم و یک View از این دیتاگرایدم درست می کنم بعد می خوایی تو یه Cell از دیتاگرایدت وقتی تایپ کردی یه فرم باز بشه که یه لیستی رو از یه جدول دیگه نشون می ده می خوایی بعضی از فیلدهاش رو به دیتاگرایدت منتقل کنی برای این کار شما در فرم 1 دیتاگراید داری و در فرم 2 می خواهی اطلاعاتی رو به دیتاگراید فرم 1 منتقل کنی در فرم 2 یک متغییر و یک View از نوع فرم 1 ایجاد می کنی یه این صورت


public form1 myform1=null;
public ListCollectionView View1=null;


بعد در فرم 1 تو KeyDown سل یا هر جای دیگه که می خوایی یه لیست باز بشه به این صورت عمل می کنی


form2 frm=new form2();
frm.myform1=this;
frm.View1=this.View;
frm.ShowDialog();


الان در فرم 2 شما با استفاده از متغییر myform1 به تمام اطلاعات فرم یک دسترسی داری و در فرم 2 برای انتقال اطلاعاتت بایستی این کار رو بکنی در رویداد مثلا یک باتن به این صورت عمل می کنی


if(myform1!=null && View1!=null)
{
MyClass editclass=(MyClass)(this.View1.CurrentItem);
if(editclass!=null)
{
editclass.ID=100;
editclass.Name="Petek";
}
}
this.close();


که در اینجا من سطر جاری دیتاگرایدم که یک Object از نوع کلاسم(جدولم) MyClass است آیتم جاری View از نوع MyClass است بدست می آورم که فیلدهای کلاسم (که در اینجا من ذو تا فیلد ID و Name را برای کلاس MyClass انتخاب کردم ) را با هر چیزی که می خوام پر می کنم و در آخر هم فرم 2 رو می بندم امیدوارم که مشکت حل بشه با تشکر