Trong bài trước, chúng ta đã học cách sử dụng kbmMW SmartBind để liên kết tập dữ liệu và ListView nhằm tự động hiển thị nội dung của tập dữ liệu.
Mã nguồn cho việc liên kết:
<pre><code class="language-pascal">
procedure TFormMain.BindData;
begin
if not Assigned(DataBindings) then
DataBindings := TkbmMWBindingCollection.Create();
DataBindings.Clear;
DataBindings.Add('dsField1', ListViewMain, 'ItemText1');
DataBindings.Add('dsField2', ListViewMain, 'ItemText2');
DataBindings.Add('dsField3', ListViewMain, 'ItemImage');
MainBinding := DataBindings.Add('@', ListViewMain, '@', [mwboSync]);
end;
</code></pre>
Ở đây, ds là tập dữ liệu có ba trường: dsField1, dsField2, dsField3. ListView chứa ba đối tượng văn bản ItemText1, ItemText2, ItemText3 và một đối tượng hình ảnh ItemImage.
Gọi phương thức BindData sẽ liên kết ds với ListViewMain (dsField1 với ItemText1, dsField2 với ItemText2), từ đó ListViewMain sẽ tự động hiển thị các giá trị tương ứng. Tuy nhiên, trong thực tế, đôi khi cần tùy chỉnh thêm giao diện của ListViewItem, ví dụ như thay đổi hình ảnh dựa trên giá trị của dsField1. Để làm điều này, ta sử dụng sự kiện **OnUpdateObjects** của ListView:
<pre><code class="language-pascal">
procedure TFormMain.ListViewMainUpdateObjects(Sender: TObject; AItem: TListViewItem);
var
Img: TListItemImage;
Txt1, Txt2, Txt3: TListItemText;
begin
Txt1 := TListItemText(AItem.Objects.FindDrawable('ItemText1'));
Txt2 := TListItemText(AItem.Objects.FindDrawable('ItemText2'));
Txt3 := TListItemText(AItem.Objects.FindDrawable('ItemText3'));
if (Txt1 <> nil) and ((StrToInt(Txt1.Text) mod 5) = 0) then
begin
Txt3.Text := 'Chia hết cho 5.............................................';
Img := TListItemImage(AItem.Objects.FindDrawable('ItemImage'));
if Img <> nil then
Img.Bitmap := ImageListMain.Source[1].MultiResBitmap[0].Bitmap;
AItem.Height := 88;
Txt2.Height := 88;
end
else
begin
Txt3.Text := 'Không chia hết cho 5';
Img := TListItemImage(AItem.Objects.FindDrawable('ItemImage'));
if Img <> nil then
Img.Bitmap := ImageListMain.Source[0].MultiResBitmap[0].Bitmap;
end;
end;
</code></pre>
Bằng cách sử dụng AItem.Objects.FindDrawable, chúng ta có thể tìm các đối tượng văn bản và hình ảnh trong ListViewItem và tùy chỉnh hiển thị của chúng dựa trên giá trị cụ thể.
Ngoài ra, còn có sự kiện OnUpdatingObjects của ListView. Sự khác biệt giữa hai sự kiện này là:
- **OnUpdatingObjects** hoạt động trước khi cập nhật, tương tự như BeforeUpdateObjects.
- **OnUpdateObjects** hoạt động sau khi cập nhật, tức là AfterUpdateObjects.
Khi sử dụng kbmMWSmartBind, trong sự kiện OnUpdatingObjects, thông qua AItem.Data['ItemText1'] có thể lấy giá trị trường, nhưng không đồng bộ hóa với tập dữ liệu nếu bạn thay đổi nó. Trong sự kiện OnUpdateObjects, cũng có thể truy xuất hoặc thay đổi giá trị, nhưng sẽ không hiển thị hay cập nhật vào tập dữ liệu.