Hướng dẫn dùng ApplicationContext để chuyển đổi giữa form đăng nhập và form chính

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.

  1. Tạo 1 class kế thừa từ ApplicationContext.
  2. Khai báo các form cần control dưới dạng private.
  3. 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

7 Likes

Bài viết hữu ích! Cảm ơn bạn đã chia sẻ.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?