Thắc mắc đồ họa giao diện Winform

Trong winform, phải chạy hết code thì giao diện mới hiển thi. Vậy tôi muốn hiển thị giao diện sau mỗi hoạt động nào đó thì sao? Ở đoạn code dưới, tôi muốn thấy từng button được add vào form sau khi click vào button.

  private void button1_Click(object sender, EventArgs e)
    {
        for(int i=0;i<10;i++)
        {
            Button bt = new Button
            {
                Text = i.ToString(),
                Size = new Size(50, 50),
                Location = new Point(0, 0)
            };
            this.Controls.Add(bt);
            System.Threading.Thread.Sleep(500);
        }
    }

Từ khóa có trong câu hỏi luôn rồi: System.Threading.Thread.

4 Likes

Thread.Sleep trong trường hợp này nó block luôn message loop, cho nên GUI bị treo (không nhận interact từ user và không được update), phải làm thế này mới đúng nè:

private async void button1_Click(object sender, EventArgs e) {
    for (int i = 0; i < 10; i++) {
        Button bt = new Button {
            Text = i.ToString(),
            Size = new Size(50, 50),
            Location = new Point(0, 0)
        };
        this.Controls.Add(bt);
        await Task.Delay(500);
    }
}

Thực ra cũng có thể bật thread riêng, nhưng làm thế này thì dễ hơn.

5 Likes

Gọi Application.DoEvents() khi muốn cập nhật giao diện.

private void button1_Click(object sender, EventArgs e)
    {
        for(int i=0;i<10;i++)
        {
            //………...
            this.Controls.Add(bt);
            System.Windows.Forms.Application.DoEvents(); // gọi ở đây
            System.Threading.Thread.Sleep(500);
        }
    }
6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?