Vấn đề của nhiều bạn
Bạn có 2 form, form đăng nhập và form chính.
Bạn muốn sau khi đăng nhập, form chính hiện thị và Form đăng nhập biến mất.
Và theo nguyên tắc, bạn cho application chạy Form đăng nhập đầu tiên.
// Program.cs
Application.Run(LogInForm);
Sau đó trong from login khi đăng nhập thành công bạn close Form đăng nhập và mở Form chính.
// LogInForm.cs
if( Authentication == SUCCESS )
{
this.Close();
MainForm.Show();
}
lúc này ứng dụng của bạn sẽ close ngay vì main form của bạn là LogInForm và main thread đang chạu trên đó.
Bạn chữa cháy bằng các chỉ ẩn LogInForm thay vì close hoàn toàn.
// LogInForm.cs
if( Authentication == SUCCESS )
{
this.Hide();
MainForm.Show();
}
Có vẻ ổn. Nhưng đó không phải cách tốt nhất để control over the lifetime of the application. theo khuyến nghị từ microsoft.
Sử dụng ApplicationContext
Class Program
Nói qua một chút về class Program trong Program.cs. Nó được tạo tự động khi bạn tạo 1 ứng dụng winform mới với code sau:
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
Trong đó Form1 là main Form của ứng dụng. Khi Application được khởi chạy, nó sẽ chạy Form1 đồng thời thêm handle ExitThread vào method Closed
của Form1.
Đừng sợ thay đổi
Method này được tạo cho các ứng dụng thông thường. (main form hiện thị trước và các bước cài đặt set sau). Nhưng trong trường hợp bạn muốn toàn quyền control ứng dụng của mình, bạn có thể thay đổi nó.
Method Application.Run
có tới 3 overloads trong đó có Run (ApplicationContext context);
cho phép bạn control các Form bằng context.
Sử dụng ApplicationContext như thế nào.
- Tạo 1 class kế thừa từ ApplicationContext.
- Khai báo các form cần control dưới dạng private.
- Tùy ý thêm bớt vào các sự kiện public của các Form
//TestApplicationContext.cs
public class TestApplicationContext: ApplicationContext
{
private readonly Form1 form1;
private readonly Form2 form2;
public TestApplicationContext()
{
form1 = new Form1();
form1.Closed += Form1_Closed;
form2 = new Form2();
form2.Closed += Form2_Closed;
form1.Show();
}
private void Form2_Closed(object sender, EventArgs e)
{
ExitThread();
}
private void Form1_Closed(object sender, EventArgs e)
{
if (form1.Authentication == Authentication.SUCCESS )
{
form2.Show();
}
else
{
ExitThread();
}
}
}
Sau đó update lại Program.cs
//Program.cs
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
TestApplicationContext context = new TestApplicationContext();
Application.Run(context);
}
Tham khảo Documentation