Bắt đầu với Controls

Phạm vi áp dụng

✅ Bravo 8 · ✅ Bravo 10

<Controls> là thẻ mẹ, dùng để khai báo định nghĩa các control hoặc nhóm các control ở bên trong.

  • Có thể được khai báo trong navigator, panelEditor, panelCommand…
  • Các control có thể khai báo lồng nhau
  • Về cơ bản đều hỗ trợ tất cả các thẻ chung khi định nghĩa control — tuy nhiên tùy theo ClassName mà các thẻ được hỗ trợ có thể khác nhau

Cú pháp

<Controls>
  <Ten_Control>
    <!-- Khai báo các thẻ trong control -->
  </Ten_Control>
</Controls>

Quy ước bố cục điển hình của Editor chứng từ

<panelEditor>
  <Controls>
    <panelParent>...</panelParent>              <!-- đầu phiếu -->
    <BravoGridContainer>...</BravoGridContainer>  <!-- Grid nhập liệu -->
    <panelSummary>...</panelSummary>            <!-- cuối phiếu -->
  </Controls>
</panelEditor>

Đây chỉ là quy ước

Việc phân định như này hoàn toàn do người dùng tự định nghĩa — là quy ước chung khi thiết kế màn hình Editor của chứng từ. Ở màn hình khác có thể đặt tên khác.

Mỗi nhóm được coi là 1 control, nên cũng được hỗ trợ đầy đủ các thẻ chung tương ứng với ClassName của nó.

⚠️ Ba lưu ý sống còn

1. Thứ tự khởi tạo control

Khi Load form, các Eval bảng mẹ có khai báo thẻ controls được ưu tiên thực hiện trước.

Eval thiết lập control ở bảng con / cháu phải đặt ở bảng Parent. Nếu đặt trong ServerLoaded hay RowAdded của bảng con/cháu thì vô tác dụng — lúc đó các control chưa được khởi tạo hoặc chưa sẵn sàng nhận dữ liệu.

2. EmptyAsNull với TextBox

Ở B8, khi F2 form thì các control được khởi tạo giá trị = NULL.

Với BravoTextBox và BravoDropDownControlBase (BravoComboBox, BravoOpenFileBox, BravoOpenDirBox, BravoSaveFileBox) thì thuộc tính EmptyAsNull luôn ngầm định = True.

→ Cần hết sức lưu ý khi xử lý binding với các control này mà không kiểm tra ISNULL() thì có thể bị sai kết quả.

3. Dùng Evaluator thay vì thẻ tĩnh

Ngoài việc dùng các thẻ chung, người dùng có thể dùng Eval để thiết lập trạng thái control linh hoạt hơn theo điều kiện, thay vì chỉ chọn True/False cứng.
→ BravoEvaluator

Ngoài ra có thể khai báo thay đổi giá trị một thuộc tính áp dụng cho nhiều control ở nhiều loại màn hình khác nhau, hoặc ở tất cả màn hình nhưng theo từng ClassName, bằng cách khai báo thuộc tính đó ở Template.

Bản đồ thẻ

Bố cục & vị trí

ThẻVai trò
DockVị trí hiển thị control trên phông nền
Rows · ColsĐịnh nghĩa khung dòng / cột của control
Row · ColumnĐặt control ở dòng / cột thứ mấy
RowSpan · ColumnSpanControl nằm chồng lên mấy dòng / cột
AnchorCố định control vào các cạnh của khung chứa
MarginKhoảng cách đến các mép lề
Size · MaximumSize · MinimumSizeKích thước control
PagesKhai báo các trang (tab) trên màn hình

Hiển thị & định dạng

ThẻVai trò
StyleKhai báo gộp mọi thuộc tính định dạng
TextTên / caption của control
Font · fontStyle · nFontScaleFont chữ
BackColor · ForeColorMàu nền / màu chữ
BorderStyleKiểu khung viền
TextAlign · ImageAlignCăn chỉnh
VisibleẨn / hiện

Dữ liệu & trạng thái

ThẻVai trò
DataMemberTrường / bảng dữ liệu control hiển thị
NameTên trường dữ liệu (hỗ trợ biểu thức nhúng)
EnabledControl có bị mờ, không typing được không
ReadOnly (control)Chỉ đọc
TabStopCó dừng con trỏ khi Tab không
ClassName · AssemblyLoại control và DLL chứa nó
bDisableClipboardUpdatedChặn cập nhật clipboard
ApplyOwnerCommandPermissionÁp phân quyền của lệnh chủ (B10)

Danh mục ClassName

→ Danh mục Control A-Z

Liên quan

Layout - Tổng quan · Grid - Tổng quan · BravoEvaluator · Template