Tác giả: Nguyễn Anh Tuyên
Cấp độ bài viết: High Advance
Tóm tắt: Fast Display Very Large Database With VirtualMode

Cách 1 : Load hết Database lên bộ nhớ --> mất thời gian và cực kỳ tốn bộ nhớ.
Cách 2 : Tạo 2 button Next và Previous --> ko thân thiện và thiếu chuyên nghiệp vì nó ko tận dụng được chức năng scroll.
- Mình xin giới thiệu với các bạn một chức năng mới được hỗ trợ bởi .Net 2.0 nhằm hỗ trợ cho việc load các database cực lớn với tốc độ nhanh. Đó là chế độ VirtualMode : trong Net chỉ có 2 control hỗ trợ chế độ này là ListView và DataGridView.

- Sau nhiều ngày tìm hiểu thông qua các ebook và goolge. Cuối cùng mình đã tổng hợp, chính sửa để tạo ra một cách có thể nói là ưu việt nhất


- Mình sẽ hướng dẫn các bạn sử dụng VirtualMode với ListView với ngôn ngữ C# và Database Access.
Convert C# To Vb.Net
- Nếu bạn nào ko rành C#, có thể dùng chương trình sau đây để chuyển code từ C# sang VB.Net. Tuy nhiên, các bạn nên nhớ rằng các chương trình chuyển đổi ko hoàn toàn đúng 100%, do đó khi convert các bạn cần kiểm tra (hay chỉnh sửa nếu cần để code có thể chạy tốt).
- Ở trong các phiên bản trước thì ListView cũng có giới hạn giống như các control khác của Windows, vì nó tồn trữ tất cả các item trong bộ nhớ. Điều này có nghĩa là nếu các bạn muốn tạo ra ListView để hiển thị ví dụ 10.000 record chẳng hạn, nó sẽ lưu tất cả lên bộ nhớ, bạn sẽ nhanh chóng bị cạn kiệt bộ nhớ.
- Nhưng ở Net 2.0, ListView đã hợ trợ ảo hóa, nó cho phép hỗ trợ một lượng rất lớn dữ liệu. Với chế độ ảo hóa này, ListView chỉ load phần dữ liệu mà hiện tại nó đang được hiển thị mà thôi. Khi user Scroll tới một vị trí mới trong List, thì những item cũ sẽ bị hủy và những Item phù hợp lúc này sẽ được yêu cầu và điền vào nơi cần nó. Những Item này được tồn trữ ở một nơi tách biệt, nó cho phép bạn có được cách đệm trước dữ liệu bằng bộ đệm cũng như nhận dữ liệu hiệu quả.
- Nhờ thế khi dùng VirtualMode ta có thể hiển thị các Database rất lớn (lên tới hàng triệu Record) với tốc độ rất nhanh và tiết kiệm bộ nhớ rất nhiều.
II. Thuộc tính và Event liên quan tới VirtualMode
Để sử dụng được VirtualMode bạn cần
- Thiết lập thuộc tính VirtualMode của ListView là True.
- Thiết lập kích thước cho chế độ ảo hóa VirtualListSize bằng với tổng số Record ở trong Database.
- Event RetrieveVirtualItem sẽ được sinh ra khi mà ListView cần một Item nào đó để hiển thị.
- Event CacheVirtualItems được sinh ra khi mà ListView ko thể tìm thấy dữ liệu của Item, nó sẽ kêu event CacheVirtualItems này để yêu cầu tạo bộ đệm mới.
III. Xây dựng Project sử dụng VirtualMode
1. Giao diện Project và Database cho nó.
- Tạo Project Windows Application.
- Add vào Form một ListView ListView1, một Button btnLoad và một Label lblThoigian.
- 1 Database 100 ngàn Record để Test.

2. Thiết lập các giá trị hỗ trợ cho sự hoạt động của VirtualMode
Các giá trị này phải có tầm vực cục bộ trong form để mọi thủ tục trong form có thể truy xuất nó.
- objConnect : kết nối tới database
- _CachedSize : quy định kích thước của bộ đệm. Các bạn lưu ý rằng bộ đệm càng lớn thì khi scroll càng mượt hơn, nhưng đồng thời cũng tốn bộ nhớ hơn, do đó các bạn hãy tự xác định mức phù hợp. Ở đây mình chọn 500 (Nghĩa là đệm trước 500 record).
- _TotalRecord : Tổng số Record trong Database
- _FirstIndex , _LastIndex : chỉ số record đầu tiên và cuối trong tập hợp record mà ta lấy ra từ Database.
- DTCachedItems : đây là bộ đệm nơi lưu trữ các Record cần truy xuất
Code cho các giá trị trên
Mã: Chọn tất cả
#region "Biến cục bộ trong Form" private OleDbConnection objConnect; //Connection toàn cục const int _CachedSize = 500; //Kích thước bộ đệm int _TotalRecord = 0; //Tổng số Record trong Database int _FirstIndex = 0, _LastIndex = 0 ; //Chỉ số bắt đầu và kết thúc của bộ đệm private DataTable DTCachedItems = null; // Bộ đệm lưu trữ Record #endregion
3.1 Tạo Kết nối tới Database
Mã: Chọn tất cả
//Tạo một Connection private void subCreateConnect() { String varChuoiConnect = "Provider = Microsoft.Jet.OLEDB.4.0 ;" + "Data Source =" + Application.StartupPath + @"\Solieutest.mdb;" + "User ID = admin;" + "Persist Security Info=False"; objConnect = new OleDbConnection(varChuoiConnect); }
Ta dùng Method sau
Mã: Chọn tất cả
//Lấy tổng số Record ở trong Databaseprivate int GetTotalRecord() { objConnect.Open(); OleDbCommand command = new OleDbCommand("Select Count(*) From DanhsachSV", objConnect); _TotalRecord = (int)command.ExecuteScalar(); objConnect.Close(); return _TotalRecord; }
Để làm đuọc điều này ta dựa vào một biến thể của Method Fill
Mã: Chọn tất cả
//Tìm dữ liệu để Cached private DataTable GetDataCached(int pFromIndex, int pNumberRecord) { objConnect.Open(); OleDbDataAdapter da = new OleDbDataAdapter("Select * From DanhsachSV", objConnect); DataSet ds = new DataSet(); da.Fill(ds, pFromIndex, pNumberRecord, "Danhsachsv"); objConnect.Close(); ds.Dispose(); return ds.Tables["Danhsachsv"]; }