سوال در مورد فرم های برنامه در سی شارپ

Milo

Active Member
می بخشید من سوالی دارم در مورد فرم ها . راستش یک برنامه دارم که داخلش از دو تا فرم باید استفاده کنم . یک دکمه روی فرم اولی قرار دادم برای اینکه به فرم دومی وارد بشه ، منتها نمی خوام وقتی فرم 2 اجرا شد فرم 1 ام هم نمایش داده بشه . پس اومدم و فرم 1 رو hide کردم . و برای اینکه باز هم برگردم به فرم 1 باید فرم 2 بسته بشه . ولی اینبار نباید از hide استفاده بشه چون با بستن برنامه برنامه خاتمه پیدا نمی کنه !! :-/

حالا باید از چه دستوری استفاده کنم ؟ برای vb می شه از دستور end استفاده کرد ولی در #C نمی دونم باید چه کاری رو انجام بدم .

ممنون می شم اگر راهنمایی کنید . :)
 

saalek110

Well-Known Member
برای خروج برنامه از دستور زیر استفاده کنید:
کد:
Application.Exit();
اگر اشتباه متوجه شدم بفرمایید.
 

Milo

Active Member
ممنون ولی این کد هایی که شما نوشتید که داخل پروپرتی ها یا متد های فرم نیست ؟ :-/

آخه ببینید من دو تا windows form دارم حالا می خوام اول frmMain ام نمایش داده بشه بعد بازدن یک دکمه ای به فرم دوم برم یعنی frmSecond ام . حالا برای رویداد کلیک روی دکمه فلان روی فرم 1 ام نوشتم :

کد:
    private void btnSearch_Click(object sender, EventArgs e)
        {
            Form1 y = new Form1();
            Form2 u = new Form2();

            y.Hide();
            u.Show();
        }

و برای دکمه بازگشت روی دوم ام هم عین همین کد رو قرار دادم یعنی این :

کد:
 private void btnBack_Click(object sender, EventArgs e)
        {
            Form1 t = new Form1();
            Form2 r = new Form2();

            r.Hide();
            t.Show();

        }

حالا سواله من اینه : ببینید وقتی که فرم 1 و یا فرم 2 hide می شه برنامه خاتمه پیدا نمی کنه !!! بعدم یک مشکل بوجود میاد اونم اینه که اصلا فرم 1 رو پنهان نمی کنه و با زدن دکمه بازگشت دوبارهیک فرم دیگه نمایش داده می شه :neutral: من چه کاری باید انجام بدم که این طوری نشه ؟ :sad:

ممنون از راهنمایی ها تون .
 

saalek110

Well-Known Member
شما اگر فایل Program.cs را باز کنید داریم:
کد:
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace two_form_examing
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
[COLOR="Blue"]
            Application.Run(new Form1());[/COLOR]
        }
    }
}
در اینجا می بینید که فرم 1 به طور اتوماتیک شروع می شود. پس در دکمه ای که روی فرم 1 گذاشتید نیازی به نمونه سازی از فرم 1 نیست. و ثانیا وقتی شما دارید فرم 1 را می بینید یعنی فرم 1 قبلا خلق شده پس در دو قسمت کدی که شما گذاشتید در قسمت اول کدهایتان این کدها:
کد:
  Form1 y = new Form1();
    y.Hide();
زائد است.
اگر می خواهید فرم 1 را مخفی کنید بنویسید:
کد:
 this.Hide();
کلمه this یعنی همان فرمی که داخلش هستیم. در وی بی دات نت فکر کنم کلمه me به کار می رود به جای آن.
با این کد فرم 1 مخفی میشه. برای خروج از حالت run از منوی دیباگ stop را بزنید.

حالا می رسیم به بحث فرم 2 :
فرم 2 خلق نشده. پس اول باید نمونه ای از آن بسازیم. البته باید قبلا هم فرمی به پروژه افزوده باشید.
کد:
            //this.Hide();
            Form2 u = new Form2();
            u.Show();
با کد بالا که مثلا در رویداد کلیک یک باتون است شما باعث نمایش فرم 2 می شوید.

حالا کد زیر را امتحان کنید:
کد:
            //this.Hide();
            Form2 u = new Form2();
            Form2 u2 = new Form2();
            u2.Show();
            u.Show();
با زدن باتون حاوی کد بالا دو فرم علاوه بر فرم 1 به نمایش در می آید.
این دو فرم نمونه هایی از قالب فرم 2 است.
مثلا روی فرم 2 قبل اجرا دو تکست باکس بیافزایید که با اجرای کد بالا دو فرم دارید که روی هر یک دو تکست باکس وجود دارد.
توجه داشته باشید که با بستن فرم 1 ما باعث می شویم هر 3 فرم بسته شود و کلا برنامه از حالت اجرا خارج شود. چون شخصیت برنامه ما در Program.cs وابسته به فرم 1 است. اگر می خواهید این دیکتاتوری فرم 1 خاتمه یابد باید Program.cs را دستکاری کنید. البته شاید جای نگرانی نباشد چون می توانیم فرم 1 را مخفی کنیم و برنامه همچنان در حالت اجرا باقی بماند.

حالا کد را ساده می کنیم. همان طور که شما می خواهید . یعنی:
کد:
            this.Hide();
            Form2 u = new Form2();
            u.Show();
با اجرای کد بالا قسمت اول مقصود شما برآورده می شود یعنی فرم 1 مخفی شده و فرم 2 آشکار می شود.

===========================

حالا می رویم فاز دو : یعنی مخفی کردن فرم 2 و دوباره آشکار کردن فرم 1 .
دکمه ای روی فرم 2 بیافزایید با کد زیر:
کد:
            this.Hide();
            //Form1.???
خط اول که یعنی فرمی که داخلشیم را مخفی کن.
اما اینجا فرم 1 شناخته شده نیست.
و من نتوانستم آنرا به این طریق show کنم.

===============================
من نمی دانم راه صحیح چیست ولی کد زیر:
کد:
 Form1 t = new Form1();
 t.Show();
را هم مناسب نمی دانم.
البته در فاز دو کد زیر:
کد:
            this.Hide();
            //Form1.???
            Form1 t = new Form1();
            t.Show();
ظاهرا باعث رسیدن به مقصود است.
و شما به آنچه می خواستید رسیده اید.
ولی من نگران اینم که تجمعی از فرومها ایجاد شود زیرا ما داریم مرتبا نمونه می سازیم و مخفی می کنیم.
در کد بالا شاید به جای this.Hide استفاده از close بهتر باشد.
===============================
در فرم 1 دو دکمه اضافه کنید با کدهای زیر:
کد:
        private void button1_Click(object sender, EventArgs e)
        {
            
            Form2 u = new Form2();
            u.Show();
            this.Hide();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
بار اول اگر دکمه دوم را بزنیم برنامه خاتمه می یابد ولی بعد یک پاسکاری با فرم 2 با زدن دکمه دوم برنامه خاتمه نمی یابد. یعنی ما داریم تکثیر فرم می کنیم.
======================
این توضیحات باشه تا بعد.
 

Milo

Active Member
در فرم 1 دو دکمه اضافه کنید با کدهای زیر:
کد:
        private void button1_Click(object sender, EventArgs e)
        {
            
            Form2 u = new Form2();
            u.Show();
            this.Hide();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
بار اول اگر دکمه دوم را بزنیم برنامه خاتمه می یابد ولی بعد یک پاسکاری با فرم 2 با زدن دکمه دوم برنامه خاتمه نمی یابد. یعنی ما داریم تکثیر فرم می کنیم.
======================
این توضیحات باشه تا بعد.


ممنون خیلی عالی و تفهیمی توضیح دادید . منم دقیقا همین مشکل رو دارم . برنامه خاتمه پیدا نمی کنه !؟ و دلیلش هم اینه که داریم به طور مداوم از روی نمونه فرم 1 یکی می سازیم .

بازم ممنون به خاطر پاسخ خوبتون . من منتظر بقیه جواب شما می مونم . مرسی . :wink:
 

saalek110

Well-Known Member
یک پست به عنوان راه حلی برای یک سری برنامه ها:

پروژه ای بسازید.
یک فرم دیگر اضافه کنید. ( من این کار را از پنجره Solution Explorer با کلیک راست بر روی نام پروژه ( نه نام سولوشن - در 2005 سولوشن آیکون چند رنگی دارد ولی پروژه آیکون سبز رنگی دارد) و انتخاب Add و بعد New Item... و بعد در پنجره باز شده دومی که Windows Form است انجام می دهم. )

حالا در رویداد کلیک یک باتون که به فرم 1 می افزایید کد زیر را قرار دهید:
کد:
            Form2 u = new Form2();
            u.ShowDialog();

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

=======================
چرا من این کد را نوشتم؟
گفتیم که فرم 1 به خاطر کدهای فایل Program.cs حالت شاه شطرنج را دارد. یعنی اگر او نابود شود هر تعداد فرمی هم که باز باشد فایده ای ندارد و برنامه خاتمه می یابد.
پس من آمدم با باز کردن modal دیگر فرمها این شاه را حفظ کردم.
شاید این هم برای برنامه هایی یک راه حل باشد.
در این برنامه فرم 1 مخفی نشده بلکه غیر قابل دسترس شده.
 

Milo

Active Member
ممنون واقعا کمک کردید مرسی .
toyou.gif
 

saalek110

Well-Known Member
اما به عنوان راه حلی برای مسئله شما.
من یک پروژه ساختم به نام one_king_and_two_rook یعنی یک شاه و دو قلعه.

طرز ساخت:
یک پروژه با 3 فرم ایجاد کنید. یعنی یک پروژه بسازید و فرم 2 و فرم 3 را بیافزایید. فرم base میشه king و دو فرم بعدی میشوند rook .

در رویداد Form1_Activated از فرم 1 کد زیر را قرار دهید:
کد:
            Form2 frm2 = new Form2();
            frm2.Show();
            this.Hide();
با کد بالا شاه یعنی فرم 1 به محض ورود به عرصه خود را hide می کند و بازی را به فرم 2 می سپارد.
حالا نوبت فرم 2 است که در حکم قلعه اول بازی را با قلعه دوم یعنی فرم 3 شروع کند. در رویداد کلیک باتونی که به فرم 2 می افزایید کد زیر را بیافزایید:

کد:
            Form3 frm3 = new Form3();
            frm3.Show();
            this.close();
توجه کنید که Close می کنیم نه Hide . فرض من که فعلا مطمئن نیستم این است که با Close حافظه آزاد می شود. اگر رفتید تحقیق کردید و دیدید این رویداد یعنی Close مناسب نیست رویداد دیگری را جایگزین کنید.

حالا بازی میرسه به قلعه دومی یعنی همان فرم 3 . باتونی اضافه کنید با کد زیر:
کد:
            Form2 frm2 = new Form2();
            frm2.Show();
            this.Close();

درست شد. پینگ پونگ فرمی بین فرم 2 و فرم 3 ساخته شد.
ولی من تست نکردم که با Close حافظه ها آزاد می شود یا نه.

در برنامه بالا با بستن فرم 2 یا فرم 3 برنامه خاتمه نمی یابد چون فرم 1 همچنان مخفی است.
برای بستن آن می توانید در رویداد بسته شدن فرمهای 2 و 3 کد اختتام برنامه یعنی :
کد:
Application.Exit();
را بیافزایید.
 

Milo

Active Member
ممنون ولی این راه حلی که شما نوشتید در حقیقت طوریه که من در فرم 2 یا 3 یعنی فرمهای فرعی برنامه می تونم برنامه رو خاتمه بدم نه در فرم اصلی !!! درسته ؟

شما نوشتید در فرم 2 یا 3 کد اختتام رو بنویسم !؟

میشه داخل فرم 1 این کار رو بکنم ؟ یعنی بیام و یک دکمه برای خروج بگذارم و اونجا ( زمانی که یک نمونه از فرم 1 دوباره show شد ) این کدی که شما نوشتید رو قرار بدم :


کد:
Application.Exit();
 

Milo

Active Member
من این کاری رو که گفتید انجام دادم . مرسی . خیلی خیلی ممنونم .
 

saalek110

Well-Known Member
من با مخفی کردن فرم 1 در برنامه کلا اونو از بازی خارج کردم تا بتونم فرم های 2 و 3 را Close کنم. چون نمیشد فرم 1 را Close کرد.
یعنی نقش فرم 1 را به فرم 2 دادم. تا از دردسر بسته شدن برنامه خلاص بشوم.
شما می توانید از فرم 1 هیچ استفاده ای نکنید یا بعضی استفاده ها را بکنید.
برای اختتام برنامه هم از اون کد Application.Exit(); در جاهای مناسب در فرم 2 و فرم 3 استفاده کنید. مثلا وقتی کاربر با زدن ضربدر گوشه فرمهای 2 و 3 آنها را می بندد رویدادش را پیدا کنید و این کد را درش قرار دهید. یا دکمه ای با کپشن Exit بسازید روی فرمهای مناسب و کد مذکور را در آن قرار دهید.
 

saalek110

Well-Known Member
از کد زیر برای یافتن تعداد فرمهای باز استفاده کنید:
کد:
 textBox1.Text = Application.OpenForms.Count.ToString();
 

alimz64

New Member
در سی شارپ اگر نام استان را وارد کنیم نام شهر را نشان با استفاده از اس کیو ال سرور دهد
 

alimz64

New Member
در سی شارپ اگر نام استان را وارد کنیم نام شهر را با استفاده از اس کیو ال سرور نشان دهد
 

alimz64

New Member
در سی شارپ اگر نام استان را وارد کنیم نام شهر را با استفاده از اس کیو ال سرور نشان دهد
 

hidden spy

New Member
سلام دوست عزیز مطمئنم مشکلت با این حل میشه
کد:
        private void button2_Click(object sender, EventArgs e)
        {
            System.Threading.Thread mythread = new System.Threading.Thread(new System.Threading.ThreadStart(Nima));
            mythread.Start();
            this.Close();
        }
        public static void Nima()
        {

            Application.Run(new Mainform());

        }
 

جدیدترین ارسال ها

بالا