PDA

View Full Version : سوال: بستن یک فرم و رفتن به فرم بعدی



h.jaza
یک شنبه 17 شهریور 1387, 10:13 صبح
سلام

من دو تا فرم دارم که می خوام زمانی که مثلا روی یه باتن از فرم اول کلیک شد، این فرمم بسته بشه و فرم دوم وسم باز بشه. (مثلا اول برنامه که کاربر باید نام کاربری و رمزشو بزنه و بعد این فرم بسته بشه و وارد فضای اصلی برنامه بشه)

می خواستم ببینم چجوری باید این کارو انجام بدم؟

من خودم هیچ راهی غیر از Hide کردن فرم اول و Show کردن فرم دوم به ذهنم نرسید. اگر کمکم کنید، ممنون میشم.

با تشکر

pesare_ariyayi
یک شنبه 17 شهریور 1387, 10:19 صبح
فکر نمی کنم این کار, ایده آل باشه. شما می تونید تو form load event فرم اصلیتون, فرم اصلیتون رو hide کنید و فرمی رو که اول می خواید نمایش بدید رو show کنید. و اگر user , pass درست بود فرم رو hide یا dispose کنید و فرم اصلی رو نمایش بدید.

h.jaza
یک شنبه 17 شهریور 1387, 10:25 صبح
منم خودم همیشه همین کارو می کردم ولی این کار اگر تعداد فرم های برنامه زیاد باشه و یا خود برنامه با دیتا بیس های حجیمی کار بکنه، خیلی بار رو سیستم میزاره تا حدی که سیستم به هنگی هم میرسه اولا.

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

mo.esmp
یک شنبه 17 شهریور 1387, 20:52 عصر
this.Dispose();
GC.Collect();

hatami84.5
یک شنبه 17 شهریور 1387, 21:30 عصر
من روش gc را امتحان کردم جواب نداد

البته با کسب اجازه از دوست عزیزم منم سوالی داشتم که دیدم به این موضوع نزدیکه و از باز کردن تایپیک اضافی جلوگیری کنم
اگه یه فرم داشته باشیم که username & passWord را بگیره و اتفاقا این فرم اصلیمون باشه چه جوری میشه که با وجود یه کلید در فرم child فرم اصلی را بست تا برنامه کلا بسته بشه

h.jaza
یک شنبه 17 شهریور 1387, 23:32 عصر
this.Dispose();
GC.Collect();


mo.esmp جان میشه بیشتر راجع به اینی که گفتی توضیح بدی.


اگه یه فرم داشته باشیم که username & passWord را بگیره و اتفاقا این فرم اصلیمون باشه چه جوری میشه که با وجود یه کلید در فرم child فرم اصلی را بست تا برنامه کلا بسته بشه

درست متوجه نشدم چی میگی. تو یه فرم اصلی داری که می خوای ببندیش؟ خوب مشکلش چیه؟:متفکر:

اگر می خوای کل برنامت بسته بشه، خوب از ()Application.Exit می تونی استفاده کنی ولی اینکه این فرم دوم چیکارس رو نمی فهمم.

mo.esmp
دوشنبه 18 شهریور 1387, 00:11 صبح
فرم دوم رو در فرم اصلی بصورت DialogForm احضار میکنیم


DialogForm frmDialog = new DialogForm();
frmDialog.ShowDialog();
پس از احضار فرم دوم وقتی که کارمون باهاش تمام شد و اون رو Hide کردیم درفرم اصلی


frmDialog.Dispose();
GC.Collect();

bachebahal_1363
دوشنبه 18 شهریور 1387, 00:28 صبح
از دستور زیر در Button مورد نظر استفاده کن .



Frm_Main frmmain = new Frm_Main();
frmmain.show();
this.Close();

noroozifar
دوشنبه 18 شهریور 1387, 01:21 صبح
در فرم اصلی مثلا فرم 1 می نویسی form2 f=new form2()
f.visibel=true;
this.clos();
بعد از اتمام کار در فرم دوم می نویسی form1 g=new form2()
g.visible=true;
this.clos();

h.jaza
دوشنبه 18 شهریور 1387, 10:44 صبح
اولا از دوستان که نظراتشون رو میگن تشکر می کنم و ثانیا:

فرم دوم رو در فرم اصلی بصورت DialogForm احضار میکنیم


DialogForm frmDialog = new DialogForm();
frmDialog.ShowDialog();
پس از احضار فرم دوم وقتی که کارمون باهاش تمام شد و اون رو Hide کردیم درفرم اصلی


frmDialog.Dispose();
GC.Collect();



mo.esmp عزیز من باز هم متوجه نشدم. اگر زحمت بکشی و برنامشو وسم بنویسی، خیلی ازت ممنون میشم.

از دستور زیر در Button مورد نظر استفاده کن .

Frm_Main frmmain = new Frm_Main();
frmmain.show();
this.Close();
bachebahal_1363 (http://barnamenevis.org/forum/member.php?u=17968) جان این کدی که شما نوشتی کار نمیده به خاطر اینکه زمانی که کامپایلر به کد ()frmMain.Show می رسه، میره و وارد لود فرم اصلی میشه لذا فرم لاگین رو نمی بنده و زمانی که کارش توی فرم اصلی تموم شد برمیگرده و این فرم لاگین رو هم می بنده. پس اونی که من می خوام نیست.

در فرم اصلی مثلا فرم 1 می نویسی form2 f=new form2()
f.visibel=true;
this.clos();
بعد از اتمام کار در فرم دوم می نویسی form1 g=new form2()
g.visible=true;
this.clos();
جناب noroozifar، اینی هم که شما گفتی اشتباه هستش. به خاطر اینکه خصوصیت visible فرم ها به صورت پیش فرض ture هستش و ما برای نمایشش باید از Show یا ShowDialog استفاده کنیم نه visible اونها.

بازم از دوستان به خاطر همین اظهار نظرهاشون تشکر میکنم هر چند هنوز به جواب نرسیده.:تشویق:

bachebahal_1363
سه شنبه 19 شهریور 1387, 01:26 صبح
یه نگاهی به تاپیک زیر بنداز

بستن یک فرم بوسیله فرم دیگر (http://barnamenevis.org/forum/showthread.php?t=98962&highlight=%D8%A8%D8%B3%D8%AA%D9%86+%D9%81%D8%B1%D9 %85+%D8%A8%D9%88%D8%B3%DB%8C%D9%84%D9%87+%D8%AF%DB %8C%DA%AF%D8%B1&page=2)

h.jaza
سه شنبه 19 شهریور 1387, 10:28 صبح
bachebahal_1363 (http://barnamenevis.org/forum/member.php?u=17968) جان، خیلی ممنونم از این لینکی که دادین. اساتید، خیلی مفصل بحث کرده بودن به خصوص آقای کیانی که پوکوندن. ولی مشکل من رو حل نکرد چونکه اون تاپیک به حاشیه کشیده شد و ...

لذا از دوستان خواهش می کنم اگه روش درستشو که با اصول OOP و کپسوله کردن تضادی نداره، میدونن؛ خواهش میکنم که بگن تا این مسئله برای من حل بشه.

bachebahal_1363
سه شنبه 19 شهریور 1387, 16:32 عصر
والا من دقیقا وقت نکردم کل تاپیک رو بخونم اما یه دستور آقای sinpin قرار داده بودند که در زیر می نویسم اما من خودم استفاده کردم جواب نداد شاید خود آقای sinpin بتونن کمک بکنن .


Application.OpenForms["Form1"].Close();

دقیقا نمی دونم اما مثل اینکه به یک Access در مورد باز بودن فرم ها احتیاج هست .

bachebahal_1363
سه شنبه 19 شهریور 1387, 16:57 عصر
روش های زیر رو بکار ببر انشاء الله که جواب بگیری :
1- خوب به علت اینکه Form1 شما به صورت MainForm و فرمی که در ابتدای برنامه Run می شه که این اطلاعات در واقع در کلاس program تنظیم می شه شما زمانی که فرم دومی رو باز می کنین و فرم اول رو می بندین در واقع کل Application رو می بندین به همین علت برنامه بسته می شه ، در صورتیکه اگر کد زیر رو در فرم دوم و سوم به کار ببرید که MainForm نیستند دقیقا جواب می ده و هیچ مشکلی در برنامه پیش نمیاد در نتیجه باید Form اصلی رو فرم دیگری قرار بدین که در زمان بسته شدن فرم اول فرم بعدی به صورت صحیح نمایش پیدا کنه :


Form3 frm3 = new Form3();
frm3.Show();
this.Close();


2- روش دوم این هست که فرمی که می خواهید در ابتدای اجرای برنامه نمایش داده بشه رو در کلاس Program به صورت زیر و باز به صورت یک DialogBox نمایش بدین و در صورت صحیح بودن رمز الباقی کارها انجام و فرم اصلی برنامه نمایش داده بشه و در صورت صحیح نبودن Application رو Close کنه :


using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace Appliction
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
new Form2().ShowDialog();
Application.Run(new Form1());
}
}
}

h.jaza
سه شنبه 19 شهریور 1387, 21:18 عصر
bachebahal_1363 (http://barnamenevis.org/forum/member.php?u=17968) جان خیلی ممنونم. همونطوری که گفتی

... به علت اینکه Form1 شما به صورت MainForm و فرمی که در ابتدای برنامه Run می شه که این اطلاعات در واقع در کلاس program تنظیم می شه شما زمانی که فرم دومی رو باز می کنین و فرم اول رو می بندین در واقع کل Application رو می بندین به همین علت برنامه بسته می شه ...
و این اشتباه من بود که بهش توجه نداشته بودم و یکی دیگه اینکه من همیشه از ShowDialog استفاده می کردم که در نتیجش نمی شد فرم قبلی رو بست.

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

و اما در مورد تاپیکی که لینکشو گذاشته بودی؛ من اونو کامل خوندم ولی روشی رو هم که sinpin (http://barnamenevis.org/forum/member.php?u=6235) بهش اشاره کرده بود، تست کردم و کاملا هم درست هستش و اون هم روش جالبی هستش و به کار گیریش هم خیلی سادس. تنها کافی مثلا در رویداد یک باتن در فرم سومی، اون خط کد رو بنویسی تا مثلا فرم دومی بسته بشه.


public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Application.OpenForms["Form2"].Close();
}
}

ولی همونطور که گفتم من مشکلم عدم توجه به MainForm بود که شما به اونو به من متذکر شدی که: با بستنش، کل پروژه بسته میشه.

mo.esmp
چهارشنبه 20 شهریور 1387, 00:26 صبح
اولا از دوستان که نظراتشون رو میگن تشکر می کنم و ثانیا:

mo.esmp عزیز من باز هم متوجه نشدم. اگر زحمت بکشی و برنامشو وسم بنویسی، خیلی ازت ممنون میشم.

bachebahal_1363 (http://barnamenevis.org/forum/member.php?u=17968) جان این کدی که شما نوشتی کار نمیده به خاطر اینکه زمانی که کامپایلر به کد ()frmMain.Show می رسه، میره و وارد لود فرم اصلی میشه لذا فرم لاگین رو نمی بنده و زمانی که کارش توی فرم اصلی تموم شد برمیگرده و این فرم لاگین رو هم می بنده. پس اونی که من می خوام نیست.

جناب noroozifar، اینی هم که شما گفتی اشتباه هستش. به خاطر اینکه خصوصیت visible فرم ها به صورت پیش فرض ture هستش و ما برای نمایشش باید از Show یا ShowDialog استفاده کنیم نه visible اونها.

بازم از دوستان به خاطر همین اظهار نظرهاشون تشکر میکنم هر چند هنوز به جواب نرسیده.:تشویق:

اینم کد
http://barnamenevis.org/forum/attachment.php?attachmentid=22993&stc=1&d=1220991312

h.jaza
چهارشنبه 20 شهریور 1387, 09:38 صبح
mo.esmp (http://barnamenevis.org/forum/member.php?u=24893) عزیز، این کدی که شما نوشتی چی ارتباطی با مسئله ی من داره. من می خواستم که با باز شدن فرم دومی فرم اولی بسته بشه نه اینی که شما نوشتی. شما فرم دوم رو با this.Close توی خود فرم می بندی و بعد میای و توی ادامه ی فرم اول، اونرو Dispose می کنی. این ارتباطی به کاری که من می خواستم انجام بدم نداشت ولی در کل از شما هم که زحمت کشیدن و نظرتون رو گفتین تشکر میکنم. ضمنا من جوابمو همونطور که تو پست 15 توضیح دادم گرفتم.

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

ozzy_mra
سه شنبه 10 آذر 1388, 10:24 صبح
سلام
من میخوام از LOGIN PAge بعد از ورود صحیح رمز وارد صفحه بعد بشم و Login page بسته بشه و فرم بعدی بیاد بالا فرم لاگین فرم main من هستش لطفاً منو راهنمایی کنید

ozzy_mra
سه شنبه 10 آذر 1388, 10:27 صبح
سلام
من میخوام از LOGIN PAge بعد از ورود صحیح رمز وارد صفحه بعد بشم و Login page بسته بشه و فرم بعدی بیاد بالا فرم لاگین فرم main من هستش لطفاً منو راهنمایی کنید

h.jaza
سه شنبه 10 آذر 1388, 17:54 عصر
یه نگاهی به طرز کارت بنداز:
فرم لاگین رو کردی فرم اصلی و فرم اصلی رو کردی فرم ثانویه
و این کاملا اشتباهه...
باید فرم لاگین، فرم دومی و فرم اصلی همون فرم اولی باشه و در ادامه تنها کافیه که قبل از فراخوانی فرم اول (فرم اصلی) فرم لاگین رو صدا بزنی و ...