• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

[.Net] Fastest Display Large Database With VirtualMode

Các bài viết hướng dẫn về Visual Basic .NET và C#

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

[.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi anhtuyenbk » T.Ba 27/05/2008 9:48 pm

Tên bài viết: Fast Display Very Large Database With VirtualMode
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


Fast Display Very Large Database With VirtualMode

- Bình thường khi muốn hiển thị Database, các bạn thường dùng cách là load hết database lên bộ nhớ. Cách này đơn giản nhưng chỉ có thể áp dụng tốt với cơ sở dữ liệu nhỏ mà thôi >:) . Còn đối với các cơ sở dữ liệu lớn thì nó đầy khuyết điểm. Các bạn thường dùng những cách sau đây để load Database:
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. :D
- 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 >:) >:) nhằm mục đích để nó có khả năng tùy biến cao cũng như có thể áp dụng cho nhiều trường hợp mà ko cần phải chỉnh sửa nhiều.
- 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).

ConvertCSharp2VB.rar
(19.7 KiB) Đã tải 928 lần


Part 1 : Using VirtualMode With ListView


I. VirtualMode là gì?
- Ở 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.

Hình ảnh

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 hết

  1. #region "Biến cục bộ trong Form"
  2.             private OleDbConnection objConnect; //Connection toàn cục
  3.             const int _CachedSize = 500;    //Kích thước bộ đệm
  4.             int _TotalRecord = 0;  //Tổng số Record trong Database
  5.             int _FirstIndex = 0, _LastIndex = 0 ;    //Chỉ số bắt đầu và kết thúc của bộ đệm
  6.             private DataTable DTCachedItems = null;     // Bộ đệm lưu trữ Record
  7.         #endregion


3. Các Method chính để xử lý Database

3.1 Tạo Kết nối tới Database

Mã: Chọn hết

  1. //Tạo một Connection
  2.             private void subCreateConnect()
  3.             {
  4.                 String varChuoiConnect = "Provider = Microsoft.Jet.OLEDB.4.0 ;" +
  5.                             "Data Source =" + Application.StartupPath + @"\Solieutest.mdb;" +
  6.                             "User ID = admin;" + "Persist Security Info=False";
  7.                 objConnect = new OleDbConnection(varChuoiConnect);
  8.             }
  9.  


3.2 Lấy tổng số Record trong Database
Ta dùng Method sau

Mã: Chọn hết

  1. //Lấy tổng số Record ở trong Database
  2. private int GetTotalRecord()
  3.             {
  4.                 objConnect.Open();
  5.                 OleDbCommand command = new OleDbCommand("Select Count(*) From DanhsachSV", objConnect);
  6.                 _TotalRecord = (int)command.ExecuteScalar();
  7.                 objConnect.Close();
  8.                 return _TotalRecord;
  9.             }


3.3 Lấy một tập hợp Record trong Database dựa vào vị trí thứ tự của record
Để 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 hết

  1. //Tìm dữ liệu để Cached
  2.             private DataTable GetDataCached(int pFromIndex, int pNumberRecord)
  3.             {
  4.                 objConnect.Open();
  5.                 OleDbDataAdapter da = new OleDbDataAdapter("Select * From DanhsachSV", objConnect);
  6.                 DataSet ds = new DataSet();
  7.                 da.Fill(ds, pFromIndex, pNumberRecord, "Danhsachsv");
  8.                 objConnect.Close();
  9.                 ds.Dispose();
  10.                 return ds.Tables["Danhsachsv"];
  11.             }
Sửa lần cuối bởi anhtuyenbk vào ngày T.Năm 29/05/2008 9:46 am với 5 lần sửa.


Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

Re: [Net]***View Huge Database With VirtualMode + ListView

Gửi bàigửi bởi anhtuyenbk » T.Tư 28/05/2008 3:29 pm

4. Mẹo vặt để hiển thị database nhanh nhất
- Các bạn có thấy trên hình minh họa chương trình đã load 100 ngàn record với 16 miligiay không? Để làm được điều này chúng ta cần có một vài mẹo văt.
Trong sự kiện Form Load ta sẽ nạp sẵn tất cả các giá trị như:
- Tạo sẵn kết nối (mà không phải lúc nhấn btnLoad mới tạo ra).
- Lấy sẵn tổng số Record.
- Đệm trước cached.

Mã: Chọn hết

  1. private void frmMain_Load(object sender, EventArgs e)
  2.         {
  3.             //Tạo Connect tới Database
  4.             subCreateConnect();
  5.             _FirstIndex = 0;
  6.             _LastIndex = _FirstIndex + _CachedSize - 1;
  7.             DTCachedItems = GetDataCached(_FirstIndex, _CachedSize);
  8.             _TotalRecord = GetTotalRecord();
  9.  
  10.         }


5. Xử lý btnLoad
Dùng để thực thi việc hiển thị Dữ liệu từ Database lên ListView

Mã: Chọn hết

  1. //Load Virtual Mode
  2.             private void btnLoad_Click(object sender, EventArgs e)
  3.             {
  4.                 int start = DateTime.Now.Millisecond;
  5.                 //Add Column
  6.                 listView1.View = View.Details;
  7.                 listView1.Columns.Add("STT", 100);
  8.                 listView1.Columns.Add("Name", 100);
  9.                 listView1.Columns.Add("Phone", 100);
  10.                 listView1.Columns.Add("Addres", 100);
  11.                 listView1.Columns.Add("Email", 300);
  12.                 //Lấy tổng số record trong database và kích hoạt Virtual Mode
  13.                 listView1.VirtualMode = true;
  14.                 listView1.VirtualListSize = _TotalRecord;
  15.                 int end = DateTime.Now.Millisecond;
  16.                 lblThoigian.Text = _TotalRecord.ToString() + " Records \n" + Convert.ToString(Math.Abs(end-start)) + " Miligiay" ;
  17.  
  18.             }


6. Xử lý Event RetrieveVirtualItem
- Như đã nói ở trên khi ListView cần hiển thị một item nào đó nó sẽ phóng thích ra sự kiện này. Trong sự kiện này thì tham số quan trọng nhất là e.ItemIndex và e.Item.

Mã: Chọn hết

  1. //Xử lý về việc nạp dữ liệu lên Listview
  2.             private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
  3.             {
  4.                 DataRow row = null;
  5.                 //Lấy dữ liệu cần lấy
  6.                 if ((DTCachedItems != null) && (e.ItemIndex >= _FirstIndex) && (e.ItemIndex <= _LastIndex))
  7.                 {
  8.                     row = DTCachedItems.Rows[e.ItemIndex - _FirstIndex];
  9.                 }
  10.                 //Kiểm tra dữ liệu lấy được
  11.                 if (row != null)
  12.                 {
  13.                     //Nạp giá trị cho Item
  14.                     e.Item = new ListViewItem(row["STT"].ToString());
  15.                     e.Item.SubItems.Add(row["Name"].ToString());
  16.                     e.Item.SubItems.Add(row["Address"].ToString());
  17.                     e.Item.SubItems.Add(row["Phone"].ToString());
  18.                     e.Item.SubItems.Add(row["Email"].ToString());
  19.                 }
  20.                 else  //Không có dữ liệu
  21.                 {
  22.                     e.Item = new ListViewItem(e.ItemIndex.ToString());
  23.                 }
  24.             }


7. Xử lý Event CacheVirtualItems
- Khi mà ListView ko tìm được giá trị để hiển thị lên thì nó sẽ sinh ra Event này để ta biết mà tìm cache mới

Mã: Chọn hết

  1. //Xử lý về bộ đệm dữ liệu
  2.             private void listView1_CacheVirtualItems(object sender, CacheVirtualItemsEventArgs e)
  3.             {
  4.                 //Nếu Item cần lấy còn nằm trong bộ đệm thì thoát ra
  5.                 if ((DTCachedItems != null) && (e.StartIndex >= _FirstIndex) && (e.EndIndex <= _LastIndex+1))
  6.                     return;
  7.                 //Lấy bộ đệm mới
  8.                 _FirstIndex = e.StartIndex - 200;
  9.                 if (_FirstIndex < 0) _FirstIndex = e.StartIndex;
  10.                 _LastIndex = _FirstIndex + _CachedSize - 1;
  11.                 DTCachedItems = GetDataCached(_FirstIndex, _CachedSize);
  12.             }
  13.  


IV . Test kết quả thu được
Tải Project mẫu tại đây

VirtualMode Project.rar
Source code bằng C#
(718.37 KiB) Đã tải 1283 lần


VirtualMode_With_ListView.rar
Source code bằng VB.Net
(729.32 KiB) Đã tải 1092 lần


- Bây giờ bạn hãy chạy Project, nhấn nút Load. Sau đó nhấn PageUp, PageDown hay scroll chuột thoải mái, các bạn sẽ cảm nhận được hiệu quả của nó ngay.
- Sau đó các bạn hãy tăng kích thước bộ đệm lên 5000 .

Mã: Chọn hết

  1. const int _CachedSize = 5000
  2.  
Các bạn sẽ cảm nhận đuọc ngay sự khác biệt so với 500.
Sửa lần cuối bởi anhtuyenbk vào ngày T.Ba 08/07/2008 3:37 pm với 3 lần sửa.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

Re: [Net] ***Fast Display Very Large Database With VirtualMode

Gửi bàigửi bởi anhtuyenbk » T.Bảy 05/07/2008 8:22 pm

Lần tới sẽ là VirtualMode và DataGridView.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

gau bien
Thành viên chính thức
Thành viên chính thức
Bài viết: 39
Ngày tham gia: T.Tư 02/04/2008 10:32 am

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi gau bien » T.Bảy 12/07/2008 9:00 am

Bạn Anh Tuyên ơi, phần Part 2 : Using VirtualMode With dataGridview không biết lúc nào thì được bạn đăng tiếp nhỉ. Quả thực, tôi đang mong bài đó của bạn. Cái datagridview của tôi cũng bị chậm như rùa và tôi chưa thể sử lý được. Tôi cũng có tham khảo các trang nói về Using VirtualMode With dataGridview, và thử nhưng chưa làm đựợc, chắc do trình độ của tôi chưa tới. Tôi rất mong bài của bạn sẽ được tiếp tục tải lên cho tôi và các bạn khác được học tập từ anh. Tôi xin cảm ơn anh trước.

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi anhtuyenbk » T.Tư 30/07/2008 11:00 am

Part II : Using VirtualMode With DataGridView

Bây giờ chúng ta sẽ tiếp tục nghiên cứu ứng dụng VirtualMode vơi DataGridView để tối ưu tốc độ ứng dụng Load CSDL của mình. Tuy nhiên nên nhớ rằng vì DataGridView là một control phức tạp và nặng nề hơn ListView rất nhiều, do đó nó sẽ ko mượt như khi ta sử dụng ListView.
I. Các bổ sung cần có để làm được điều này
- Database được dùng ở phần I.
- Toàn bộ các phần 2,3,4 của Part I được sử dụng lại trong bài hướng dẫn này

II. Xử lý với DataGridView
1. Thủ tục Load cho DataGridView
Bao gồm các việc như :
- Add các column cần thiết, chỉnh độ rộng
- Thiết lập tổng số dòng cho DataGridview (tương tự như VirtualListSize của ListView vậy).
- Kích hoạt chế độ VirtualMode của DataGridView

Mã: Chọn hết

  1. private void btnLoadDGV_Click(object sender, EventArgs e)
  2.         {
  3.             int start = DateTime.Now.Millisecond;
  4.             //Add Column
  5.             DGVVirtualMode.Columns.Add("STT", "STT");
  6.             DGVVirtualMode.Columns.Add("Name", "Name");
  7.             DGVVirtualMode.Columns.Add("Phone", "Phone");
  8.             DGVVirtualMode.Columns.Add("Address", "Address");
  9.             //Tạo column Email và chỉnh độ rộng
  10.             DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
  11.             col.Name="Email";
  12.             col.HeaderText="Email";
  13.             col.Width = 200;
  14.             DGVVirtualMode.Columns.Add(col);
  15.             //Thiết lập tổng số dòng cho DataGridView
  16.             DGVVirtualMode.RowCount = _TotalRecord + 1;
  17.             //Bật Virtual Mode cho DataGridView
  18.             DGVVirtualMode.VirtualMode = true;
  19.             //Lấy tổng số record trong database và kích hoạt Virtual Mode
  20.             int end = DateTime.Now.Millisecond;
  21.             lblThoigian.Text = _TotalRecord.ToString() + " Records \n" + Convert.ToString(Math.Abs(end - start)) + " Miligiay";
  22.         }

hay

Mã: Chọn hết

  1. Private Sub btnLoadDGV_Click(ByVal sender As Object, ByVal e As EventArgs)
  2.             Dim start As Integer = DateTime.Now.Millisecond
  3.             'Add Column
  4.             DGVVirtualMode.Columns.Add("STT", "STT")
  5.             DGVVirtualMode.Columns.Add("Name", "Name")
  6.             DGVVirtualMode.Columns.Add("Phone", "Phone")
  7.             DGVVirtualMode.Columns.Add("Address", "Address")
  8.             'T?o column Email và ch?nh d? r?ng
  9.             Dim col As New DataGridViewTextBoxColumn()
  10.             col.Name = "Email"
  11.             col.HeaderText = "Email"
  12.             col.Width = 200
  13.             DGVVirtualMode.Columns.Add(col)
  14.             'Thi?t l?p t?ng s? dòng cho DataGridView
  15.             DGVVirtualMode.RowCount = _TotalRecord + 1
  16.             'B?t Virtual Mode cho DataGridView
  17.             DGVVirtualMode.VirtualMode = True
  18.             'L?y t?ng s? record trong database và kích ho?t Virtual Mode
  19.             Dim [end] As Integer = DateTime.Now.Millisecond
  20.             lblThoigian.Text = _TotalRecord.ToString() + " Records " & Chr(10) & "" + Convert.ToString(Math.Abs([end] - start)) + " Miligiay"
  21.         End Sub


2. Event quan trọng để làm việc với VirtualMode
- Để cung cấp dữ liệu cho DataGridView ở chế độ VirtualMode ta cần phải xử lý Event CellValueNeeded của DataGridView.
Lưu ý rằng : Nếu bạn chỉ copy hay convert code, sau đó copy vào Form thì event này vẫn chưa được gắn kết với DataGridView. Bạn phải vào của sổ Properties của DataGridView để tiến hành gắn kết Event CellValueNeeded của DataGridView với thủ tục này

Mã: Chọn hết

  1. private void DGVVirtualMode_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
  2.         {                                    
  3.             //Đệm dữ liệu mới
  4.             if ((e.RowIndex < _FirstIndex) || (e.RowIndex > _LastIndex))
  5.             {
  6.                 _FirstIndex = e.RowIndex - 200 ;
  7.                 if (_FirstIndex < 0) _FirstIndex = e.RowIndex;
  8.                 _LastIndex = _FirstIndex + _CachedSize - 1;
  9.                 DTCachedItems = GetDataCached(_FirstIndex, _CachedSize);
  10.             }
  11.             DataRow row = null;
  12.             //Lấy dữ liệu cần lấy
  13.             if ((DTCachedItems != null) && (e.RowIndex >= _FirstIndex) && (e.RowIndex <= _LastIndex))
  14.             {
  15.                 row = DTCachedItems.Rows[e.RowIndex - _FirstIndex];
  16.             }
  17.             //Kiểm tra dữ liệu lấy được
  18.             if (row != null)
  19.             {
  20.                 //Nạp dữ liệu cho các cột
  21.                 switch (this.DGVVirtualMode.Columns[e.ColumnIndex].Name)
  22.                 {
  23.                     case "STT":
  24.                         e.Value = row["STT"].ToString();
  25.                         break;
  26.                     case "Name":
  27.                         e.Value = row["Name"].ToString();
  28.                         break;
  29.                     case "Phone":
  30.                         e.Value = row["Phone"].ToString();
  31.                         break;
  32.                     case "Address":
  33.                         e.Value = row["Address"].ToString();
  34.                         break;
  35.                     case "Email":
  36.                         e.Value = row["Email"].ToString();
  37.                         break;
  38.                 }
  39.             }
  40.             else  //Không có dữ liệu
  41.             {
  42.                 e.Value = "";
  43.             }
  44.         }
  45.  

Hay

Mã: Chọn hết

  1. Private Sub DGVVirtualMode_CellValueNeeded(ByVal sender As Object, ByVal e As DataGridViewCellValueEventArgs)
  2.             'Ð?m d? li?u m?i
  3.             If (e.RowIndex < _FirstIndex) OrElse (e.RowIndex > _LastIndex) Then
  4.                 _FirstIndex = e.RowIndex - 200
  5.                 If _FirstIndex < 0 Then
  6.                     _FirstIndex = e.RowIndex
  7.                 End If
  8.                 _LastIndex = _FirstIndex + _CachedSize - 1
  9.                 DTCachedItems = GetDataCached(_FirstIndex, _CachedSize)
  10.             End If
  11.             Dim row As DataRow = Nothing
  12.             'L?y d? li?u c?n l?y
  13.             If (DTCachedItems IsNot Nothing) AndAlso (e.RowIndex >= _FirstIndex) AndAlso (e.RowIndex <= _LastIndex) Then
  14.                 row = DTCachedItems.Rows(e.RowIndex - _FirstIndex)
  15.             End If
  16.             'Ki?m tra d? li?u l?y du?c
  17.             If row IsNot Nothing Then
  18.                 Select Case Me.DGVVirtualMode.Columns(e.ColumnIndex).Name
  19.                     Case "STT"
  20.                         e.Value = row("STT").ToString()
  21.                     Case "Name"
  22.                         e.Value = row("Name").ToString()
  23.                     Case "Phone"
  24.                         e.Value = row("Phone").ToString()
  25.                     Case "Address"
  26.                         e.Value = row("Address").ToString()
  27.                     Case "Email"
  28.                         e.Value = row("Email").ToString()
  29.                 End Select
  30.             Else
  31.                 'Không có d? li?u
  32.                 e.Value = ""
  33.             End If
  34.         End Sub
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

Hình đại diện của người dùng
vuathongtin
Điều hành viên
Điều hành viên
Bài viết: 1028
Ngày tham gia: CN 02/05/2010 10:03 pm
Đến từ: Xứ sở DG
Has thanked: 2 time
Been thanked: 105 time
Liên hệ:

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi vuathongtin » T.Sáu 07/01/2011 11:13 am

Anh Tuyên có ngâm cứu về sự kiện SearchForVirtualItem của ListView không ? Nếu có thì chia sẻ cho e tí đi, :)
Bùi Thành Nhân
CNTT-Sở Thông tin & Truyền thông tỉnh Phú Yên
giasulaptrinh.com
Skype:vuathongtin

loicuagio
Bài viết: 2
Ngày tham gia: T.Ba 10/05/2011 10:35 am
Been thanked: 4 time

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi loicuagio » T.Sáu 13/05/2011 9:10 pm

Hay thật

phongtieutu
Bài viết: 2
Ngày tham gia: T.Tư 12/01/2011 6:43 am

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi phongtieutu » T.Tư 12/10/2011 7:38 pm

Bài viết rất rất hay và rất hữu ích trong viêc lập trình trên CSDL lớn, xin cảm ơn

thanhme16
Thành viên tích cực
Thành viên tích cực
Bài viết: 164
Ngày tham gia: T.Sáu 05/12/2008 4:41 pm
Has thanked: 7 time
Been thanked: 1 time

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi thanhme16 » T.Hai 17/10/2011 5:09 pm

Bài hướng dẫn hay thật, nhưng nếu có hướng dẫn bên LINQ to Entities nữa thì hay biết mấy

phongtieutu
Bài viết: 2
Ngày tham gia: T.Tư 12/01/2011 6:43 am

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi phongtieutu » T.Sáu 21/10/2011 11:42 am

Cảm ơn bạn Tuyên về bài viết rất hữu ích. Tuy nhiên khi sử dụng ListView trong chết độ virtual molde mình vướng mắc một số vấn đền sau:
1/. Khi mình lọc số bản ghi dự vào chuỗi gõ ở 1 textbox và nạp lại lítview dựa vào datatable này thì bị báo lỗi như hình đính kèm.
2/. Khi chọn một item trên listview thì không thể lấy giá trị của item đó.

Vậy có cách nào khắc phục 02 vấn đề trên không? Xin chỉ giáo giúp
Tập tin đính kèm
loiloadlistView.JPG
loiloadlistView.JPG (20.75 KiB) Đã xem 5048 lần

hapvn
Thành viên chính thức
Thành viên chính thức
Bài viết: 30
Ngày tham gia: T.Bảy 04/07/2009 5:50 pm
Has thanked: 2 time
Been thanked: 5 time

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi hapvn » T.Sáu 06/01/2012 9:04 am

Cám ơn bạn đã đưa một code rất hay!
Mình phát triển thêm thì thấy có vấn đề
Mình chạy code VirtualMode_With_ListView nhấn btnLoad thì nhận được dữ liệu từ access. Xong mình chạy qua access thêm sửa xóa dử liệu.
Quay về phần VirtualMode_With_ListView nhấn btnLoad thì nhận thấy VirtualMode_With_ListView có load dữ liệu lại nhưng mà không hiển thị những cái thay đổi lên! Khi mình dùng chức năng thanh cuộn của Listview thì dữ liệu mới được cập nhật lên. Cho mình hỏi có cách nào khi nhấn btnLoad thì dữ liệu được load lên ListView liền không mà không cần phải cuộn ListView!
Chân Thành Cám Ơn

thiensonhoakich
Bài viết: 2
Ngày tham gia: T.Ba 11/06/2013 1:42 am
Has thanked: 1 time

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi thiensonhoakich » T.Ba 11/06/2013 12:02 pm

Rất Hay. Cảm ơn rất nhiều ^^

thiensonhoakich
Bài viết: 2
Ngày tham gia: T.Ba 11/06/2013 1:42 am
Has thanked: 1 time

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi thiensonhoakich » T.Tư 12/06/2013 12:06 am

Cho mình hỏi là làm sao khắc phục sự cố khi load lên mà không có dữ liệu thì nó báo lỗi (cả ListView và GirdView)
Thêm vào đó là làm sao xử lý event CacheVirtualItems và RetrieveVirtualItem (Trường hợp có 2 ListView trong cùng 1 Form). Thì khi mình chạy chương trình thì nó chỉ load event của ListView nào tạo đầu tiên, còn cái ListList tạo sau thì không vào được CacheVirtualItems và RetrieveVirtualItem.
Mình muốn biết lý do và cách khắc phục tình trạng đó?

thuyan1990
Thành viên trung thành
Thành viên trung thành
Bài viết: 299
Ngày tham gia: T.Bảy 02/01/2010 10:23 am
Has thanked: 20 time
Been thanked: 2 time

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi thuyan1990 » CN 30/03/2014 11:06 pm

cái này hình như áp dụng checkbox không được anh ơi!

hapvn
Thành viên chính thức
Thành viên chính thức
Bài viết: 30
Ngày tham gia: T.Bảy 04/07/2009 5:50 pm
Has thanked: 2 time
Been thanked: 5 time

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi hapvn » T.Ba 17/03/2015 1:25 pm

AnhTuyenBk ơi! anh chuyển Sang SQL SERVER được không anh? Em chuyển hoài mà không chạy được.

nghiaducon
Thành viên chính thức
Thành viên chính thức
Bài viết: 45
Ngày tham gia: T.Hai 11/03/2013 3:48 pm
Has thanked: 8 time
Been thanked: 1 time

Re: [.Net] Fastest Display Large Database With VirtualMode

Gửi bàigửi bởi nghiaducon » T.Tư 10/06/2015 2:19 pm

ai cho em xin cái demo bên VB.net với


Quay về “[.NET] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách