Misalnya, Asumsikan saya dalam formulir 1 maka saya ingin:
- Buka formulir 2 (dari tombol di formulir 1)
- Tutup formulir 1
- Fokus pada formulir 2
Misalnya, Asumsikan saya dalam formulir 1 maka saya ingin:
Jawaban:
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();
}
form2.Closed += (s, args) => this.Close();Bolehkah saya tahu bagaimana pernyataan ini bekerja? apa sebenarnya (s,args)itu?
(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.
Coba lakukan ini ...
{
this.Hide();
Form1 sistema = new Form1();
sistema.ShowDialog();
this.Close();
}
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());
}
}
}
loginForm.UserSuccessfullyAuthenticatedsebelumnya) atau mungkin status global untuk memutuskan apakah akan menjalankan kembali formulir login, atau menjalankan formulir lain, atau mungkin menghentikan proses.
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.
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:
jadikan frmMain sebagai bentuk startup; seperti inilah tampilan Program.cs saya:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
di frmLogin saya, buat properti publik yang diinisialisasi ke false dan disetel ke true hanya jika login berhasil terjadi:
public bool IsLoggedIn { get; set; }
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.
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
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();
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);
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
}
//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();
}
Kode ini dapat membantu Anda:
Master frm = new Master();
this.Hide();
frm.ShowDialog();
this.Close();
this.Visible = false;
//or // will make LOgin Form invisivble
//this.Enabled = false;
// or
// this.Hide();
Form1 form1 = new Form1();
form1.ShowDialog();
this.Dispose();
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();
}
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
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.
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();
}
this.Visible = falselalu this.Hide? Mengapa melakukan hal yang sama dua kali?
Form1dan tidak melakukan apa-apa dengannya?