PDA

View Full Version : سوال: مشکل با برنامه های چند فرمی !



Milo_22
یک شنبه 22 اردیبهشت 1387, 12:53 عصر
با عرض سلام خدمت تمامی دوستان :

می بخشید یک سوال دارم راجع به برنامه هایی که داخلشون از چند تا فرم استفاده می شه !

من یک برنامه ساده در این رابطه نوشتم ، یه برنامه ای هستش که یک لیست از اعداد رو از کابر دریافت می کنه و بصورت صعودی مرتب می کنه !
برای نمایش لیست از textbox استفاده کردم ، که یکی از دوستانم پیشنهاد داد که بهتره از ListBox استفاده کنم . من فعلا اون قسمت برنامه رو تغییر ندادم . حالا توضیح برنامه :
ببینید اگر کاربر عددی رو اشتباه تایپ کنه ، داخل آرایه یک عدد اشتباه ثبت می شه . بعد برای اینکه عدد رو پاک کنه ( حالا بعد از اینکه کاملا آرایه رو پر کرد یا هم زمان با اون ) یه فرم دیگه ای باز کردم که کابر عدد مورد نظرش رو از داخل آرایه حذف کنه و بعد از حذف با زدن کلید بازگشت که روی فرم 2 قرار دادم به فرم اصلی برگرده !
حالا مشکلم اینجاست :
من نمی خواستم زمانی که کاربر داره روی فرم 2 کار می کنه فرم اصلی برنامه هم قابل دیدن باشه ، پس فرم1 رو hide کردم و داخل فرم2 هم برای اینکه بتونم به فرم 1 برگشت کنم یک نمونه از فرم 1 ساختم که بعد از کلیک روی دکمه بازگشت فرم2 بسته بشه و فرم1 هم نمایش داده بشه ! اینم کد هاش :


private void btnBack_Click(object sender, EventArgs e)
{
this.Hide();
Form1 t = new Form1();

t.Show();

}

مشکل اینجاست که زمانی کاربر حتی بدون حذف مقدار از فرم2 برگشت میکنه به فرم اصلی برنامه تمام آرایه ای که داخل TextBox ئه دورن فرم 1 بوده پاک میشه و هیچ عددی نمایش داده نمیشه ! :افسرده:
می خوام یک راه حل بهتری برای این کارم انجام بدم و یا اگر میشه راهنماییم کنید تا زمانی که دارم به فرم1 برگشت می کنم آرایه ام پاک نشه !

ممنون .

amir.khanlari
یک شنبه 22 اردیبهشت 1387, 18:08 عصر
كد مربوط به پاك كردن عدد اشباه در ارايه را نيز بگذاريد

Milo_22
دوشنبه 23 اردیبهشت 1387, 12:29 عصر
كد مربوط به پاك كردن عدد اشباه در ارايه را نيز بگذاريد

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

ولی کد مربوط به جستجوی عدد در فرم 2 اینه :



private void btnSearch2_Click(object sender, EventArgs e)
{

double temp =0;
temp = double.Parse(txtNum.Text);
int i = 0;
// foreach (temp in Form1 .NextArray)
// {
// lstResult .Items.Add(temp);
// }
for (i = 0; i < Form1.NextArray.Length - 1; i++)
{
if (Form1.NextArray[i] == temp)
// lstResult.Text = Convert.ToString(Form1.NextArray[i]);
lstResult.Items.Add(temp);

}

}

Mahdi.Kiani
دوشنبه 23 اردیبهشت 1387, 13:05 عصر
با عرض سلام خدمت تمامی دوستان :

می بخشید یک سوال دارم راجع به برنامه هایی که داخلشون از چند تا فرم استفاده می شه !

من یک برنامه ساده در این رابطه نوشتم ، یه برنامه ای هستش که یک لیست از اعداد رو از کابر دریافت می کنه و بصورت صعودی مرتب می کنه !
برای نمایش لیست از textbox استفاده کردم ، که یکی از دوستانم پیشنهاد داد که بهتره از ListBox استفاده کنم . من فعلا اون قسمت برنامه رو تغییر ندادم . حالا توضیح برنامه :
ببینید اگر کاربر عددی رو اشتباه تایپ کنه ، داخل آرایه یک عدد اشتباه ثبت می شه . بعد برای اینکه عدد رو پاک کنه ( حالا بعد از اینکه کاملا آرایه رو پر کرد یا هم زمان با اون ) یه فرم دیگه ای باز کردم که کابر عدد مورد نظرش رو از داخل آرایه حذف کنه و بعد از حذف با زدن کلید بازگشت که روی فرم 2 قرار دادم به فرم اصلی برگرده !
حالا مشکلم اینجاست :
من نمی خواستم زمانی که کاربر داره روی فرم 2 کار می کنه فرم اصلی برنامه هم قابل دیدن باشه ، پس فرم1 رو hide کردم و داخل فرم2 هم برای اینکه بتونم به فرم 1 برگشت کنم یک نمونه از فرم 1 ساختم که بعد از کلیک روی دکمه بازگشت فرم2 بسته بشه و فرم1 هم نمایش داده بشه ! اینم کد هاش :


private void btnBack_Click(object sender, EventArgs e)
{
this.Hide();
Form1 t = new Form1();

t.Show();

}

مشکل اینجاست که زمانی کاربر حتی بدون حذف مقدار از فرم2 برگشت میکنه به فرم اصلی برنامه تمام آرایه ای که داخل TextBox ئه دورن فرم 1 بوده پاک میشه و هیچ عددی نمایش داده نمیشه ! :افسرده:
می خوام یک راه حل بهتری برای این کارم انجام بدم و یا اگر میشه راهنماییم کنید تا زمانی که دارم به فرم1 برگشت می کنم آرایه ام پاک نشه !

ممنون .

سلام
خوب طبیعی است که وقتی نمونه جدیدی از فرم 1 در فرم شماره 2 ایجاد می کنید، همه چیز reset می شود. به این دلیل که این فرم جدید، دیگه فرم اصلی برنامه شما نیست.
من لزومی نمی بینم که فرم اصلی hide بشه، مگر اینکه واقعا دلیل خاصی براش وجود داشته باشه..
برای اینکه کاربر زمانی که فرم 2 باز می شود، نتواند به فرم 1 یا همون فرم اصلی برنامه دسترسی داشته باشد، فرم 2 را به صورت Dialog باز کنید.
مثال




private Void button1_Click(object sender,EventArgs e)
{

Form2 f =new Form2();
f.ShoeDialog();

}


در این صورت تا زمانی که فرم 2 باز باشد، دسترسی به فرم اصلی امکان پذیر نیست..

مقاله زیر را بخونین، جواب خیلی از سوالات فعلی و احتمالا سوالات آیندتون را خواهید یافت..
مرجع کامل نحوه ارتباط بین آبجکت های دو فرم مختلف (http://barnamenevis.org/forum/showpost.php?p=449646&postcount=46)

موفق باشید

Milo_22
دوشنبه 23 اردیبهشت 1387, 15:36 عصر
سلام
خوب طبیعی است که وقتی نمونه جدیدی از فرم 1 در فرم شماره 2 ایجاد می کنید، همه چیز reset می شود. به این دلیل که این فرم جدید، دیگه فرم اصلی برنامه شما نیست.
من لزومی نمی بینم که فرم اصلی hide بشه، مگر اینکه واقعا دلیل خاصی براش وجود داشته باشه..
برای اینکه کاربر زمانی که فرم 2 باز می شود، نتواند به فرم 1 یا همون فرم اصلی برنامه دسترسی داشته باشد، فرم 2 را به صورت Dialog باز کنید.
ممنونم ، ولی کسی که برنامه رو می خواد ، گفته اصلا فرم 1 دیده نشه ! در زمانی که قرم 2 در حال نمایش هست.

حالا اگه من از shoedialog استفاده نکنم ، باید چه کاری انجام بدم که هم فرم 1 نمایش داده نشه و هم اطلاعات درون فرم ریست نشه !

Mahdi.Kiani
دوشنبه 23 اردیبهشت 1387, 17:03 عصر
ممنونم ، ولی کسی که برنامه رو می خواد ، گفته اصلا فرم 1 دیده نشه ! در زمانی که قرم 2 در حال نمایش هست.

حالا اگه من از shoedialog استفاده نکنم ، باید چه کاری انجام بدم که هم فرم 1 نمایش داده نشه و هم اطلاعات درون فرم ریست نشه !

راه های زیادی هست

در جایی که می خواهید فرم 2 نمایش داده بشه ( مثلا در رویداد کلیک یک دکمه در فرم 1 ) کد زیر را بنویسید



Form2 f = new Form2();
f.Owner = this;
this.Hide();
f.Show();





حالا در رویداد Form_Closed فرم 2 کد زیر را بنویسید:



private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
if (!this.Owner.IsDisposed)
this.Owner.Show();
}




البته راه های دیگه ای هم هست
موفق باشید