Winforms - Vì sao nên dùng List thay vì DataTable cho GridControl

    Hồi trước khi mới code mình sử dụng DataTable theo các project có sẵn. Sau này cảm thấy DataTable có vài điểm bất lợi nên đã tìm cách khác để tối ưu hơn. Một nguyên nhân nữa là mình thường xử lý các Form nhập liệu dạng lưới. Để tăng tốc quá trình tạo Form thì cần thiết kế code sao cho dễ copy paste và chỉnh sửa (chỉ thay đổi name, type các trường dữ liệu), không phải tốn thời gian Design giao diện. Sau đây mình sẽ nêu lý do và cách giải quyết những vấn đề mà mình gặp phải. Nếu anh em có cách nào hay xin nhờ góp ý.

    Để ví dụ mình có 1 BindingList và 1 DataTable

    

1) Dùng Linq dễ hơn

    

2) Hạn chế lỗi chính tả khi truyền chuỗi string FieldName

    

  • Mình sử dụng tạo cột động của gridView khi gán DataSource. Cho nên trong trường hợp cần truy xuất 1 Cell bất kỳ của lưới sẽ sử dụng method nameof() của C# 6.0. Ví dụ:

    

  • Ngoài ra khi cần thay đổi tên 1 Column trên Database, trên Code cũng cần thay đổi theo => Nếu sử dụng truyền string FieldName vào thì việc Find and Replace khá bất tiện. Ngược lại nếu dùng List thì chỉ cần vào class Model đổi tên và để Visual Studio refactor những thằng liên quan

3) Sử dụng Data Annotation để setting cột

  • Không cần phải mở design trên giao diện hoặc viết code. Sử dụng DataAnnotation sẽ giúp chúng ta giải quyết nhanh những vấn đề Format trên lưới

    

4) Binding 2 chiều với INotifyPropertyChanged và thư viện PropertyChanged.Fody

  • Khi chúng ta muốn thay đổi 1 Cell nào trên lưới thì thường phải dùng:
gridView.SetRowCellValue(gridView.FocusedRowHandle, nameof(Sample.Date), dummyDate);
  • Vậy khi thay đổi dưới DataSource BindingList<Sample> thì dữ liệu trên lưới sẽ thay đổi thế nào?
int index =  gridView.GetDataSourceRowIndex(gridView.FocusedRowHandle);
    
listSample[index].Date = dummyDate;
  • Tuy DataSource đã thay đổi nhưng dữ liệu trên lưới vẫn như cũ. Nếu muốn lưới cập nhật thì phải dùng:
gridView1.RefreshRowCell()
gridView.RefreshRow() 
  • Mình muốn khi có thay đổi dưới DataSource thì trên lưới thay đổi luôn chứ không phải mất công refresh data => Sử dụng INotifyPropertyChanged và PropertyChanged.Fody

    

  • Thư viện Fody tự động add property notification cho tất cả các class thực thi INotifyPropertyChanged => Khi có bất cứ thay đổi trên BindingList<Sample> thì gridControl sẽ nhận được thông báo và tự động cập nhật dữ liệu mới thấy đổi trên lưới

5) Sử dụng mô hình MVP

    Trên Presenter, việc xử lý logic, tính toán sẽ dễ hơn khi sử dụng object class. Việc viết Unit Test cũng dễ dàng hơn

Nguồn: Viblo

Bình luận
Vui lòng đăng nhập để bình luận
Một số bài viết liên quan