C#'da formları arası geçiş sonrası ilk formu kapatamıyorum

Hata hakkında detaylı bilgi verirseniz sorununuzu çözebilirim.

Form2 ye geçerken ilgili kodu butona veya nasıl geçiyorsanız içine girmeniz yeterli.

C#:
Form2 form_2 = new Form2();
form_2.Show();
Hide();
 
Son düzenleme:
Hatayı tahmin edebiliyorum. Muhtemelen proje arkada açık kalıyor ve sen tekrar üstünde değişiklik yaptıktan sonra başlatmak istediğinde dosyayı silemediği için sana hata veriyor. Çözüm basit. Form 2'yi kapatıp uygulamadan çıkacağın zaman application.exit metodunu kullanırsın, böylece bu sorunla karşılaşmazsın.

this.Close() mevcut nesneden çıkış yapar. Form1 ise C#'ın geliştirme kurallarına göre parent form olduğu için ondan çıkış yapmak tüm uygulamadan çıkış yapmak demek. Form2 ise form1'in üstünde oluşturulmuş oluyor ve çağrılıyor. this.Hide() metoduyla form1'i gizlediğinde, Form1'den çıkış yapamaz hale geliyorsun tekrar ortaya çıkartmadıkça. Bu sebeplede yaşadığın hata ortaya çıkıyor. Bug bu. O yüzden Form2'nin closing eventine yada herhangi bir butona System.Windows.Forms.Application.Exit( ) yazman gerekiyor. Bu arkadaş tüm uygulamayı kapatmaya yarıyor.

Buna alternatif çözüm olarak Form2'nin constructor parametrelerine Form1'i eklersin, public olarak işaretlenmiş tüm metodlara erişebilir olursun. Buna Show ve Close metodları dahil. Yine bunları Form2 closing eventine eklersen çözüm olacaktır. Kodları da vereyim.

Çözüm 1:
C#:
//Form1 load fonksiyonu;
private void Form1_Load(object sender, EventArgs e)
        {
            Form2 frm = new Form2(this);
            frm.Show();
        }


C#:
public partial class Form2 : Form
    {
        Form1 holder; //Form1'in kontrollerini üstüde tutması için.
                      //Eğer yeni form1 oluşturursak, asıl formu kapatamayız.
        public Form2(Form1 frm) //Buradaki parametre değişikliği önemli!
        {                         //Form1'i parametre olarak vermek gerekiyor.
            holder = frm;        //Parametreden gelen arkadaşı diğer fonksiyonların global
            InitializeComponent(); //erişebileceği bir yere koydum.
        }

        private void Form2_Closing(object sender, CancelEventArgs e) //Form2 closing eventi
        {
            holder.Close();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            this.FormClosing += Form2_Closing; //Yukarıdaki fonksiyonu evente bağladık.
        }
    }
Çözüm 2:
C#:
        //Form1 Load
private void Form1_Load(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.Show();
        }
C#:
//Form2 | Farklı kısmı bu sefer parametre değişikliği ve fazladan bir değişken yerine
// Application Exit kullandım.
public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Closing(object sender, CancelEventArgs e)
        {
            Application.Exit();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            this.FormClosing += Form2_Closing;
        }
    }
 
Çözüm olan cevabı çözüm olarak işaretler misiniz? Eğer kendiniz çözdüyseniz lütfen çözümü de anlatın.

Hocam aslında tam çözdüm dersem biraz yanlış olur. Gösterirken 1 kere açmalık olarak kullanmayı düşündüm ve hide komutuyla devam ettim. Uzun süreli bir çözüm istiyorlarsa farklı yollara başvursunlar hide bir şeye etki etmez ben tek seferlik göstermelik bir proje yaptığımdan kullandım.
 
Hocam aslında tam çözdüm dersem biraz yanlış olur. Gösterirken 1 kere açmalık olarak kullanmayı düşündüm ve hide komutuyla devam ettim. Uzun süreli bir çözüm istiyorlarsa farklı yollara başvursunlar hide bir şeye etki etmez ben tek seferlik göstermelik bir proje yaptığımdan kullandım.
Hide kullandığınız zaman uygulamayı kapatabilmeniz için kod vermiştim zaten ama?
 

Geri
Yukarı