Control và layout
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 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);
}
}Labelhiện chữ,TextBoxcho gõ chữ,Buttonlà nút bấm.FlowDirection.TopDownxếp từ trên xuống. Thứ tự hiện ra là thứ tựAdd.Dock = DockStyle.Fillcho panel phủ kín form, kéo giãn cửa sổ thì panel giãn theo.Paddingchừ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.
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ằngnew. - Control chỉ hiện khi được
AddvàoControlscủa form hoặc panel. FlowLayoutPaneltự xếp control theo thứ tựAdd.Dock = DockStyle.Fillcho control phủ kín vùng chứa nó.Labelnên cóAutoSize = trueđể không bị cắt chữ.
Tự kiểm tra
0/3 câuTạo var noteBox = new TextBox(); trong constructor nhưng chạy lên không thấy ô nhập đâu. Thiếu gì?
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?
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?