Yêu cầu phân trang trong ứng dụng WinForms
Khi xử lý dữ liệu lớn trong ứng dụng WinForms, việc thiết kế điều khiển phân trang hiệu quả là cần thiết. Bài viết này trình bày giải pháp phân trang hỗ trợ C# và VB.NET, tối ưu cho DataGridView hiển thị dữ liệu quy mô lớn trên nền tảng .NET Framework 2.0.
Thiết kế điều khiển phân trang
Điều khiển phân trang cần đáp ứng các yêu cầu:
- Tối ưu hiệu suất xử lý dữ liệu
- Hỗ trợ cấu hình linh hoạt (số dòng hiển thị/trang)
- Tích hợp sự kiện tương tác người dùng
Ví dụ triển khai logic phân trang
public class DieuKhienPhanTrang : Control
{
private int _kichThuocTrang = 10;
private int _trangHienTai = 1;
public void CapNhatDuLieu(IList nguonDuLieu)
{
var batDau = (_trangHienTai - 1) * _kichThuocTrang;
var ketThuc = Math.Min(batDau + _kichThuocTrang, nguonDuLieu.Count);
var duLieuHienThi = nguonDuLieu.GetRange(batDau, ketThuc - batDau);
dataGridView.DataSource = duLieuHienThi;
}
}
Xử lý sự kiện phân trang
Cơ chế sự kiện cho phép đồng bộ trạng thái giao diện:
private void DieuKhienPhanTrang_PhanTrangChanged(object sender, EventArgs e)
{
var trangMoi = (sender as DieuKhienPhanTrang).TrangHienTai;
dataGridView.DataSource = LayDuLieuTrang(trangMoi);
}
Tương thích ngược với .NET Framework 2.0
Để đảm bảo hoạt động trên phiên bản cũ:
- Sử dụng reflection thay thế cho các API mới
- Áp dụng kỹ thuật biên dịch có điều kiện
- Thiết kế lớp tương thích riêng biệt
Ví dụ kiểm tra tính khả dụng API
public object LayGiaTriThuocTinh(object doiTuong, string tenThuocTinh)
{
var phuongThuc = doiTuong.GetType().GetMethod("get_" + tenThuocTinh);
return phuongThuc?.Invoke(doiTuong, null);
}
Chiến lược tối ưu hiệu suất
Các kỹ thuật cải thiện hiệu năng:
- Lazy loading dữ liệu khi cần thiết
- Caching dữ liệu tĩnh
- Xử lý bất đồng bộ với async/await
Ví dụ triển khai lazy loading
public class TaiDuLieuHoanVi
{
private List<SanPham> _duLieu;
public List<SanPham> LayDuLieuTrang(int trang, int kichThuoc)
{
if (_duLieu == null) _duLieu = LayDuLieuTuCSDL();
return _duLieu.Skip((trang-1)*kichThuoc).Take(kichThuoc).ToList();
}
}