Hướng dẫn thực hành điều khiển phân trang WinForms cho C# và VB.NET

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();
    }
}

Thẻ: C# VB.NET WinForms điều khiển phân trang kỹ thuật .NET

Đăng vào ngày 11 tháng 6 lúc 18:04