c # buka formulir baru lalu tutup formulir saat ini?

89

Misalnya, Asumsikan saya dalam formulir 1 maka saya ingin:

  1. Buka formulir 2 (dari tombol di formulir 1)
  2. Tutup formulir 1
  3. Fokus pada formulir 2
tnhan07
sumber
18
Kegunaan yang mengerikan. Jika Anda menggunakan WinForms, buat saja jendela container, dan ganti panelnya. Pengguna Anda akan menyukai Anda karenanya (dan membenci Anda karena tidak melakukannya)
Claus Jørgensen
1
Dengarkan Claus! Apa yang Anda coba capai mungkin adalah a) Implementasi winforms dari rangkaian langkah berurutan seperti wizard atau b) Upaya untuk menunjukkan bentuk "hasil" setelah formulir "entri / pengiriman data". Terlepas dari apakah itu a) atau b) perilaku UI yang Anda coba terapkan adalah solusi suboptimal.
Simen S
Terima kasih Clause dan Simen S. Komentar Anda sangat membantu pemula seperti saya. Saya akan membaca lebih banyak tutorial tentang GUI dan kegunaan. Bisakah Anda merekomendasikan saya beberapa yang berguna?
tnhan07
Periksa juga [jawaban di sini] ( stackoverflow.com/questions/4759334/… ), apakah niat Anda sebenarnya hanya untuk memiliki formulir login (atau serupa).
ilias iliadis

Jawaban:

194

Solusi Steve tidak berhasil. Saat memanggil this.Close (), bentuk saat ini dibuang bersama dengan form2. Oleh karena itu Anda perlu menyembunyikannya dan mengatur event form2.Closed untuk memanggil this.Close ().

private void OnButton1Click(object sender, EventArgs e)
{
    this.Hide();
    var form2 = new Form2();
    form2.Closed += (s, args) => this.Close(); 
    form2.Show();
}
nihique
sumber
2
tidak ada acara Tertutup dalam bentuk jendela di dot net. Dapatkah Anda memberi tahu saya apakah acara FormClosed
Anjali
2
Bukankah menyembunyikan formulir pertama tetap menyimpannya dalam memori? Bagaimana kita bisa melepaskan sumber daya itu?
pengguna2635088
5
form2.Closed += (s, args) => this.Close();Bolehkah saya tahu bagaimana pernyataan ini bekerja? apa sebenarnya (s,args)itu?
Yash Saraiya
1
(s, args) => this.Close();adalah ekspresi lambda. Ini membuat fungsi "di tempat" yang dipanggil saat form2.Closedacara dipicu. (s, args)hanyalah nama untuk parameter lambda. Yang mana untuk event handler biasanya seperti itu (object sender, EventArgs e). Karena Closedtanda tangan delegasi acara menjelaskan tipenya, jenisnya tidak diberikan (Seseorang tolong perbaiki kata-kata saya jika perlu). // Secara keseluruhan, ini hanya cara yang rumit untuk tidak harus mendeklarasikan seluruh fungsi (event handler) di luar fungsi saat ini yang menangani Form2.Closedevent.
KDecker
1
ini hanya menyembunyikan formulir pertama dan membuka formulir baru tetapi tidak menutup formulir pertama
Uddyan Semwal
25

Coba lakukan ini ...

{
    this.Hide();
    Form1 sistema = new Form1();
    sistema.ShowDialog();
    this.Close();
}
MontDeska
sumber
Ini masalahnya. Saya memiliki Formulir Utama. tapi saya menggunakan formulir kecil untuk Login. Formulir ini memanggil Formulir Utama dengan metode ini. Ok kita baik-baik saja disini. Masalahnya adalah ketika Formulir Utama menunjukkan Formulir anak, dan saat menutup formulir anak ... Ia Menutup Formulir Utama juga. Jadi Karena saya menggunakan metode yang diterbitkan oleh Nihique. Kode telah bekerja dengan sangat baik! ...
MontDeska
kode ini berfungsi untuk saya. saya menggunakan VS 2015. Terima kasih
IT Vlogs
22

Banyak cara berbeda telah dijelaskan oleh jawaban lain. Namun, banyak dari mereka terlibat ShowDialog()atau form1tetap terbuka tetapi tersembunyi. Cara terbaik dan paling intuitif menurut saya adalah dengan menutup form1dan kemudian membuat form2dari lokasi luar (bukan dari dalam salah satu bentuk tersebut). Dalam kasus di mana form1dibuat Main, form2dapat dengan mudah dibuat menggunakan Application.Runseperti form1sebelumnya. Berikut contoh skenario:

Saya membutuhkan pengguna untuk memasukkan kredensial mereka agar saya dapat mengautentikasi mereka. Setelah itu, jika otentikasi berhasil, saya ingin menampilkan aplikasi utama kepada pengguna. Untuk mencapai ini, saya menggunakan dua bentuk: LogingFormdan MainForm. The LoginFormmemiliki bendera yang menentukan apakah otentikasi berhasil atau tidak. Bendera ini kemudian digunakan untuk memutuskan apakah akan membuat MainForminstance atau tidak. Tak satu pun dari formulir ini yang perlu diketahui tentang yang lain dan kedua formulir ini dapat dibuka dan ditutup dengan baik. Berikut kode untuk ini:

class LoginForm : Form
{
    public bool UserSuccessfullyAuthenticated { get; private set; }

    void LoginButton_Click(object s, EventArgs e)
    {
        if(AuthenticateUser(/* ... */))
        {
            UserSuccessfullyAuthenticated = true;
            Close();
        }
    }
}

static class Program
{
    [STAThread]
    static void Main()
    {
        LoginForm loginForm = new LoginForm();
        Application.Run(loginForm);

        if(loginForm.UserSuccessfullyAuthenticated)
        {
            // MainForm is defined elsewhere
            Application.Run(new MainForm());
        }
    }
}
Manuzor
sumber
Ini adalah trik yang bagus daripada menyembunyikan formulir. Ketika kami memiliki formulir tersembunyi untuk keluar dari aplikasi, tidak cukup hanya dengan menutup formulir saat ini. Kita harus menggunakan Application.Exit (0) dll.
Peck_alkon pada
Ini bagus, tapi menurut saya hanya cocok untuk 2 bentuk. Bagaimana dengan berbagai bentuk yang beralih di antara mereka ??
Dr. MAF
Ini dibatasi untuk menjalankan formulir secara berurutan, tidak secara paralel atau di atas satu sama lain, seperti yang diminta OP. Saya tidak yakin mengapa ini akan dibatasi hanya untuk 2 bentuk. Kode luar bebas untuk menelurkan sebanyak mungkin bentuk secara berurutan sesuai keinginan. Beralih di antara mereka juga dapat dilakukan dengan kode luar. Itu bisa memeriksa beberapa status pada formulir utama (seperti loginForm.UserSuccessfullyAuthenticatedsebelumnya) atau mungkin status global untuk memutuskan apakah akan menjalankan kembali formulir login, atau menjalankan formulir lain, atau mungkin menghentikan proses.
Manuzor
11

Masalahnya adalah dengan baris itu:

Application.Run(new Form1()); Yang mungkin dapat ditemukan di file program.cs Anda.

Baris ini menunjukkan bahwa form1 adalah untuk menangani loop pesan - dengan kata lain form1 bertanggung jawab untuk tetap menjalankan aplikasi Anda - aplikasi akan ditutup ketika form1 ditutup.

Ada beberapa cara untuk menangani ini, tetapi semuanya dengan satu atau lain cara tidak akan menutup form1.
(Kecuali kita mengubah jenis proyek ke sesuatu selain aplikasi bentuk windows)

Yang menurut saya paling mudah untuk situasi Anda adalah membuat 3 formulir:

  • form1 - akan tetap tidak terlihat dan bertindak sebagai pengelola, Anda dapat menetapkannya untuk menangani ikon baki jika Anda mau.

  • form2 - akan memiliki tombol, yang ketika diklik akan menutup form2 dan akan membuka form3

  • form3 - akan memiliki peran dari formulir lain yang perlu dibuka.

Dan berikut ini contoh kode untuk melakukannya:
(Saya juga menambahkan contoh untuk menutup aplikasi dari formulir ke-3)

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1()); //set the only message pump to form1.
    }
}


public partial class Form1 : Form
{
    public static Form1 Form1Instance;

    public Form1()
    {
        //Everyone eveywhere in the app should know me as Form1.Form1Instance
        Form1Instance = this;

        //Make sure I am kept hidden
        WindowState = FormWindowState.Minimized;
        ShowInTaskbar = false;
        Visible = false;

        InitializeComponent();

        //Open a managed form - the one the user sees..
        var form2 = new Form2();
        form2.Show();
    }

}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var form3 = new Form3(); //create an instance of form 3
        Hide();             //hide me (form2)
        form3.Show();       //show form3
        Close();            //close me (form2), since form1 is the message loop - no problem.
    }
}

public partial class Form3 : Form
{
    public Form3()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form1.Form1Instance.Close(); //the user want to exit the app - let's close form1.
    }
}


Catatan: bekerja dengan panel atau memuat kontrol pengguna secara dinamis lebih akademis dan lebih disukai sebagai standar produksi industri - tetapi menurut saya Anda hanya mencoba menjelaskan cara kerja berbagai hal - untuk tujuan itu contoh ini lebih baik.

Dan sekarang setelah prinsip-prinsipnya dipahami, mari kita coba hanya dengan dua bentuk:

  • Formulir pertama akan mengambil peran sebagai pengelola seperti pada contoh sebelumnya, tetapi juga akan menampilkan layar pertama - jadi tidak akan ditutup begitu saja.

  • Bentuk kedua akan mengambil peran menampilkan layar berikutnya dan dengan mengklik tombol akan menutup aplikasi.


    public partial class Form1 : Form
    {
        public static Form1 Form1Instance;

        public Form1()
        {
            //Everyone eveywhere in the app show know me as Form1.Form1Instance
            Form1Instance = this;
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Make sure I am kept hidden
            WindowState = FormWindowState.Minimized;
            ShowInTaskbar = false;
            Visible = false;

            //Open another form 
            var form2 = new Form2
            {
                //since we open it from a minimezed window - it will not be focused unless we put it as TopMost.
                TopMost = true
            };
            form2.Show();
            //now that that it is topmost and shown - we want to set its behavior to be normal window again.
            form2.TopMost = false; 
        }
    }

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1.Form1Instance.Close();
        }
    }

Jika Anda mengubah contoh sebelumnya - hapus form3 dari proyek.

Semoga berhasil.

GY
sumber
6

Anda tidak spesifik, tetapi sepertinya Anda mencoba melakukan apa yang saya lakukan di aplikasi Win Forms saya: mulai dengan formulir Login, lalu setelah berhasil login, tutup formulir itu dan fokus pada formulir Utama. Begini cara saya melakukannya:

  1. jadikan frmMain sebagai bentuk startup; seperti inilah tampilan Program.cs saya:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new frmMain());
    }
    
  2. di frmLogin saya, buat properti publik yang diinisialisasi ke false dan disetel ke true hanya jika login berhasil terjadi:

    public bool IsLoggedIn { get; set; }
    
  3. frmMain saya terlihat seperti ini:

    private void frmMain_Load(object sender, EventArgs e)
    {
        frmLogin frm = new frmLogin();
        frm.IsLoggedIn = false;
        frm.ShowDialog();
    
        if (!frm.IsLoggedIn)
        {
            this.Close();
            Application.Exit();
            return;
        }
    

Tidak berhasil masuk? Keluar dari aplikasi. Jika tidak, lanjutkan dengan frmMain. Karena ini adalah bentuk startup, ketika ditutup, aplikasi akan berakhir.

Barry Novak
sumber
3

gunakan potongan kode ini di form1 Anda.

public static void ThreadProc()
{
Application.Run(new Form());
}

private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
t.Start();
this.Close();
}

Saya mendapatkan ini dari sini

lakshman
sumber
Perhatikan bahwa jawaban link-only tidak disarankan, jawaban SO harus menjadi titik akhir dari pencarian solusi (vs. referensi lain yang berhenti, yang cenderung menjadi basi seiring waktu). Harap pertimbangkan untuk menambahkan sinopsis yang berdiri sendiri di sini, dengan menyimpan tautan sebagai referensi.
kleopatra
2

Jika Anda memiliki dua bentuk: frm_form1 dan frm_form2. Kode berikut digunakan untuk membuka frm_form2 dan menutup frm_form1. (Untuk aplikasi formulir windows)

        this.Hide();//Hide the 'current' form, i.e frm_form1 
        //show another form ( frm_form2 )   
        frm_form2 frm = new frm_form2();
        frm.ShowDialog();
        //Close the form.(frm_form1)
        this.Close();
surai
sumber
1

Saya biasanya melakukan ini untuk beralih di antara bentuk.

Pertama, dalam file Program saya menyimpan ApplicationContext dan menambahkan metode SwitchMainForm pembantu .

        static class Program
{
    public static ApplicationContext AppContext { get;  set; }


    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        //Save app context
        Program.AppContext = new ApplicationContext(new LoginForm());
        Application.Run(AppContext);
    }

    //helper method to switch forms
      public static void SwitchMainForm(Form newForm)
    {
        var oldMainForm = AppContext.MainForm;
        AppContext.MainForm = newForm;
        oldMainForm?.Close();
        newForm.Show();
    }


}

Kemudian di mana saja di kode sekarang saya memanggil metode SwitchMainForm untuk beralih dengan mudah ke formulir baru.

// switch to some other form
var otherForm = new MyForm();
Program.SwitchMainForm(otherForm);
Namik Hajiyev
sumber
0
private void buttonNextForm(object sender, EventArgs e)
{
    NextForm nf = new NextForm();//Object of the form that you want to open
    this.hide();//Hide cirrent form.
    nf.ShowModel();//Display the next form window
    this.Close();//While closing the NextForm, control will come again and will close this form as well
}
Prateek Shukla
sumber
Ini tidak akan berhasil. Tidak ada gunanya bersembunyi sebelum menampilkan formulir berikutnya. Ini akan dieksekusi pada waktu yang sama dan program akan dihentikan.
Ahmet Karabulut
0
//if Form1 is old form and Form2 is the current form which we want to open, then
{
Form2 f2 = new Form1();

this.Hide();// To hide old form i.e Form1
f2.Show();
}
pengguna2186819
sumber
0

Kode ini dapat membantu Anda:

Master frm = new Master();

this.Hide();

frm.ShowDialog();

this.Close();
Jaydeo Kumar Dharpure
sumber
ini ada aplikasi
Baqer Naqvi
0
                     this.Visible = false;
                        //or                         // will make LOgin Form invisivble
                        //this.Enabled = false;
                         //  or
                       // this.Hide(); 



                        Form1 form1 = new Form1();
                        form1.ShowDialog();

                        this.Dispose();
Aamir Zargar
sumber
1
Bagaimana jawaban ini menambah diskusi ini? Ini mengulangi tanpa menambahkan info penjelasan apa pun yang ada di 9 jawaban lainnya.
Edward
0

Saya pikir ini jauh lebih mudah :)

    private void btnLogin_Click(object sender, EventArgs e)
    {
        //this.Hide();
        //var mm = new MainMenu();
        //mm.FormClosed += (s, args) => this.Close();
        //mm.Show();

        this.Hide();
        MainMenu mm = new MainMenu();
        mm.Show();

    }
Sachith
sumber
Solusi ini bukan jawaban terkait untuk pertanyaan ini. Solusi Anda tidak akan menutup formulir saat ini, ini berarti formulir saat ini masih dalam proses.
Ahmet Karabulut
-1

Misalkan Anda memiliki dua Formulir, Nama Formulir Pertama adalah Formulir1 dan nama formulir kedua adalah Formulir2. Anda harus melompat dari Formulir1 ke Formulir2 masukkan kode di sini. Tulis kode seperti berikut:

Pada Form1 saya memiliki satu tombol bernama Button1, dan pada opsi kliknya tulis kode di bawah ini:

protected void Button1_Click(Object sender,EventArgs e)
{
    Form frm=new Form2();// I have created object of Form2
    frm.Show();
    this.Visible=false;
    this.Hide();
    this.Close();
    this.Dispose();
}

Semoga kode ini bisa membantu Anda

Shahnawaz
sumber
Empat metode ini: this.Visible=false; this.Hide(); this.Close(); this.Dispose();berlebihan. Anda tidak membutuhkan lebih dari Close(). Menutup formulir akan membuangnya, menyetel visibilitas formulir sama dengan menyembunyikannya, dan menyembunyikan formulir tidak ada gunanya jika tidak akan ada sebelum acara pengecatan berikutnya.
Pelayanan
-3

Saya akan menyelesaikannya dengan melakukan:

private void button1_Click(object sender, EventArgs e)
{
    Form2 m = new Form2();
    m.Show();
    Form1 f = new Form1();
    this.Visible = false;
    this.Hide();
}
Polash
sumber
3
this.Visible = falselalu this.Hide? Mengapa melakukan hal yang sama dua kali?
Neolisk
8
Juga, mengapa Anda membuat yang baru Form1dan tidak melakukan apa-apa dengannya?
Pelayanan