VieTopik
Tiếng HànTiếng AnhIT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
WinForms với OracleNền tảng WinForms
Bài 2/15
5 phút

Control và layout

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Cửa sổ trống chưa làm được gì. Muốn nhập tên sản phẩm cần một ô nhập, muốn lưu cần một nút. Bài này thêm các thành phần đó vào form và để WinForms tự xếp chúng.

Khái niệm

🔘 Control: object hiển thị trên cửa sổ, như nhãn Label, ô nhập TextBox, nút bấm Button.

📥 Controls: property chứa danh sách control con của một form hoặc một panel.

Control chỉ hiện ra khi đã được thêm vào danh sách này.

🪜 FlowLayoutPanel: control chứa các control khác và tự xếp chúng nối tiếp nhau, không cần đặt toạ độ.

Form chứa panel, panel chứa nhãn và nút. Đây là composition như bài Composition của khoá OOP: object lớn được ghép từ các object nhỏ.

Ví dụ

Giữ nguyên class Program, thay class MainForm bằng:

class MainForm : Form
{
    public MainForm()
    {
        Text = "Thêm sản phẩm";
        Width = 320;
        Height = 220;

        var panel = new FlowLayoutPanel
        {
            Dock = DockStyle.Fill,
            FlowDirection = FlowDirection.TopDown,
            Padding = new Padding(12)
        };

        var nameLabel = new Label
        {
            Text = "Tên sản phẩm",
            AutoSize = true
        };
        var nameBox = new TextBox { Width = 250 };
        var saveButton = new Button { Text = "Lưu" };

        panel.Controls.Add(nameLabel);
        panel.Controls.Add(nameBox);
        panel.Controls.Add(saveButton);
        Controls.Add(panel);
    }
}
  • Label hiện chữ, TextBox cho gõ chữ, Button là nút bấm.
  • FlowDirection.TopDown xếp từ trên xuống. Thứ tự hiện ra là thứ tự Add.
  • Dock = DockStyle.Fill cho panel phủ kín form, kéo giãn cửa sổ thì panel giãn theo.
  • Padding chừa khoảng trống 12 điểm ảnh quanh mép panel.
  • Dòng cuối Controls.Add(panel) gắn panel vào form.
MainForm FlowLayoutPanel Label TextBox Button
Form chứa panel, panel chứa ba control

Thử ngay

Xoá dòng cuối Controls.Add(panel); rồi chạy lại.

Đoán trước khi chạy: chương trình báo lỗi, hay cửa sổ vẫn mở nhưng thiếu gì đó?

Xem kết quả
Không có lỗi. Cửa sổ "Thêm sản phẩm" mở ra nhưng trống trơn.

Panel và ba control vẫn được tạo, chỉ là chưa gắn vào form. Object tồn tại trong bộ nhớ không có nghĩa là nó nằm trên cửa sổ.

Lỗi hay gặp

Chữ của Label bị cắt. Label mặc định rộng cố định 100 điểm ảnh, chữ dài hơn thế bị cắt mất.

// SAI — chỉ thấy một phần chữ
var priceLabel = new Label
{
    Text = "Giá bán (VNĐ, chưa gồm VAT)"
};
// ĐÚNG — nhãn tự rộng theo chữ
var priceLabel = new Label
{
    Text = "Giá bán (VNĐ, chưa gồm VAT)",
    AutoSize = true
};

Tóm tắt

  • Control là object: Label, TextBox, Button, tạo bằng new.
  • Control chỉ hiện khi được Add vào Controls của form hoặc panel.
  • FlowLayoutPanel tự xếp control theo thứ tự Add.
  • Dock = DockStyle.Fill cho control phủ kín vùng chứa nó.
  • Label nên có AutoSize = true để không bị cắt chữ.

Tự kiểm tra

0/3 câu
Câu 1

Tạo var noteBox = new TextBox(); trong constructor nhưng chạy lên không thấy ô nhập đâu. Thiếu gì?

Câu 2

FlowLayoutPanel TopDown lần lượt Add nút Lưu, ô nhập, nhãn. Trên cửa sổ, cái gì ở trên cùng?

Câu 3

Kéo cửa sổ to ra, panel vẫn giữ nguyên kích thước nhỏ ở góc. Nên sửa thế nào?

Ứng dụng WinForms đầu tiênSự kiện

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt