Ứng dụng kbmMWSmartBind để Liên Kết ListView với Tập Dữ Liệu - Phần Nâng Cao

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.

Thẻ: kbmMW Delphi SmartBind ListView Dataset

Đăng vào ngày 3 tháng 6 lúc 22:36