[.Net] Fastest Display Large Database With VirtualMode

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

Các điều hành viên: tungcan5diop, QUANITGROBEST

Đăng trả lời
Hình đại diện của thành viên
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: Thứ 5 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 times

[.Net] Fastest Display Large Database With VirtualMode

Gửi bài by anhtuyenbk »

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 về 1065 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 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. Các Method chính để xử lý Database

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);            } 
3.2 Lấy tổng số Record trong Database
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;            }
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 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"];            }
Sửa lần cuối bởi 5 vào ngày anhtuyenbk với 0 lần sửa trong tổng số.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang
Hình đại diện của thành viên
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: Thứ 5 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 times

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

Gửi bài by anhtuyenbk »

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 tất cả

private void frmMain_Load(object sender, EventArgs e)        {            //Tạo Connect tới Database            subCreateConnect();            _FirstIndex = 0;            _LastIndex = _FirstIndex + _CachedSize - 1;            DTCachedItems = GetDataCached(_FirstIndex, _CachedSize);            _TotalRecord = GetTotalRecord();         }
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 tất cả

//Load Virtual Mode            private void btnLoad_Click(object sender, EventArgs e)            {                int start = DateTime.Now.Millisecond;                //Add Column                listView1.View = View.Details;                listView1.Columns.Add("STT", 100);                listView1.Columns.Add("Name", 100);                listView1.Columns.Add("Phone", 100);                listView1.Columns.Add("Addres", 100);                listView1.Columns.Add("Email", 300);                //Lấy tổng số record trong database và kích hoạt Virtual Mode                listView1.VirtualMode = true;                listView1.VirtualListSize = _TotalRecord;                int end = DateTime.Now.Millisecond;                lblThoigian.Text = _TotalRecord.ToString() + " Records \n" + Convert.ToString(Math.Abs(end-start)) + " Miligiay" ;             }
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 tất cả

//Xử lý về việc nạp dữ liệu lên Listview            private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)            {                DataRow row = null;                //Lấy dữ liệu cần lấy                if ((DTCachedItems != null) && (e.ItemIndex >= _FirstIndex) && (e.ItemIndex <= _LastIndex))                {                    row = DTCachedItems.Rows[e.ItemIndex - _FirstIndex];                }                //Kiểm tra dữ liệu lấy được                if (row != null)                {                    //Nạp giá trị cho Item                    e.Item = new ListViewItem(row["STT"].ToString());                    e.Item.SubItems.Add(row["Name"].ToString());                    e.Item.SubItems.Add(row["Address"].ToString());                    e.Item.SubItems.Add(row["Phone"].ToString());                    e.Item.SubItems.Add(row["Email"].ToString());                }                else  //Không có dữ liệu                {                    e.Item = new ListViewItem(e.ItemIndex.ToString());                }            }
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 tất cả

//Xử lý về bộ đệm dữ liệu            private void listView1_CacheVirtualItems(object sender, CacheVirtualItemsEventArgs e)            {                //Nếu Item cần lấy còn nằm trong bộ đệm thì thoát ra                if ((DTCachedItems != null) && (e.StartIndex >= _FirstIndex) && (e.EndIndex <= _LastIndex+1))                    return;                //Lấy bộ đệm mới                _FirstIndex = e.StartIndex - 200;                if (_FirstIndex < 0) _FirstIndex = e.StartIndex;                _LastIndex = _FirstIndex + _CachedSize - 1;                DTCachedItems = GetDataCached(_FirstIndex, _CachedSize);            } 
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 về 1419 lần
VirtualMode_With_ListView.rar
Source code bằng VB.Net
(729.32 KiB) Đã tải về 1224 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 tất cả

const int _CachedSize = 5000 
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 3 vào ngày anhtuyenbk với 0 lần sửa trong tổng số.
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang
Hình đại diện của thành viên
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: Thứ 5 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 times

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

Gửi bài by anhtuyenbk »

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: Thứ 4 02/04/2008 10:32 am

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

Gửi bài by gau bien »

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 thành viên
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: Thứ 5 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 times

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

Gửi bài by anhtuyenbk »

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 tất cả

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

Mã: Chọn tất cả

Private Sub btnLoadDGV_Click(ByVal sender As Object, ByVal e As EventArgs)            Dim start As Integer = DateTime.Now.Millisecond            'Add Column            DGVVirtualMode.Columns.Add("STT", "STT")            DGVVirtualMode.Columns.Add("Name", "Name")            DGVVirtualMode.Columns.Add("Phone", "Phone")            DGVVirtualMode.Columns.Add("Address", "Address")            'T?o column Email và ch?nh d? r?ng            Dim col As New DataGridViewTextBoxColumn()            col.Name = "Email"            col.HeaderText = "Email"            col.Width = 200            DGVVirtualMode.Columns.Add(col)            'Thi?t l?p t?ng s? dòng cho DataGridView            DGVVirtualMode.RowCount = _TotalRecord + 1            'B?t Virtual Mode cho DataGridView            DGVVirtualMode.VirtualMode = True            'L?y t?ng s? record trong database và kích ho?t Virtual Mode            Dim [end] As Integer = DateTime.Now.Millisecond            lblThoigian.Text = _TotalRecord.ToString() + " Records " & Chr(10) & "" + Convert.ToString(Math.Abs([end] - start)) + " Miligiay"        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 tất cả

private void DGVVirtualMode_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)        {                                                //Đệm dữ liệu mới            if ((e.RowIndex < _FirstIndex) || (e.RowIndex > _LastIndex))            {                _FirstIndex = e.RowIndex - 200 ;                if (_FirstIndex < 0) _FirstIndex = e.RowIndex;                _LastIndex = _FirstIndex + _CachedSize - 1;                DTCachedItems = GetDataCached(_FirstIndex, _CachedSize);            }            DataRow row = null;            //Lấy dữ liệu cần lấy            if ((DTCachedItems != null) && (e.RowIndex >= _FirstIndex) && (e.RowIndex <= _LastIndex))            {                row = DTCachedItems.Rows[e.RowIndex - _FirstIndex];            }            //Kiểm tra dữ liệu lấy được            if (row != null)            {                //Nạp dữ liệu cho các cột                switch (this.DGVVirtualMode.Columns[e.ColumnIndex].Name)                {                    case "STT":                        e.Value = row["STT"].ToString();                        break;                    case "Name":                        e.Value = row["Name"].ToString();                        break;                    case "Phone":                        e.Value = row["Phone"].ToString();                        break;                    case "Address":                        e.Value = row["Address"].ToString();                        break;                    case "Email":                        e.Value = row["Email"].ToString();                        break;                }            }            else  //Không có dữ liệu            {                e.Value = "";            }        } 
Hay

Mã: Chọn tất cả

Private Sub DGVVirtualMode_CellValueNeeded(ByVal sender As Object, ByVal e As DataGridViewCellValueEventArgs)            'Ð?m d? li?u m?i            If (e.RowIndex < _FirstIndex) OrElse (e.RowIndex > _LastIndex) Then                _FirstIndex = e.RowIndex - 200                If _FirstIndex < 0 Then                    _FirstIndex = e.RowIndex                End If                _LastIndex = _FirstIndex + _CachedSize - 1                DTCachedItems = GetDataCached(_FirstIndex, _CachedSize)            End If            Dim row As DataRow = Nothing            'L?y d? li?u c?n l?y            If (DTCachedItems IsNot Nothing) AndAlso (e.RowIndex >= _FirstIndex) AndAlso (e.RowIndex <= _LastIndex) Then                row = DTCachedItems.Rows(e.RowIndex - _FirstIndex)            End If            'Ki?m tra d? li?u l?y du?c            If row IsNot Nothing Then                Select Case Me.DGVVirtualMode.Columns(e.ColumnIndex).Name                    Case "STT"                        e.Value = row("STT").ToString()                    Case "Name"                        e.Value = row("Name").ToString()                    Case "Phone"                        e.Value = row("Phone").ToString()                    Case "Address"                        e.Value = row("Address").ToString()                    Case "Email"                        e.Value = row("Email").ToString()                End Select            Else                'Không có d? li?u                e.Value = ""            End If        End Sub
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang
Hình đại diện của thành viên
vuathongtin
Điều hành viên
Điều hành viên
Bài viết: 1028
Ngày tham gia: Chủ nhật 02/05/2010 10:03 pm
Đến từ: Xứ sở DG
Has thanked: 2 times
Been thanked: 105 times
Tiếp xúc:

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

Gửi bài by vuathongtin »

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
* Chuyên gia MMO
cachkiemtien.online
loicuagio
Bài viết: 2
Ngày tham gia: Thứ 3 10/05/2011 10:35 am
Been thanked: 4 times

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

Gửi bài by loicuagio »

Hay thật
phongtieutu
Bài viết: 2
Ngày tham gia: Thứ 4 12/01/2011 6:43 am

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

Gửi bài by phongtieutu »

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: Thứ 6 05/12/2008 4:41 pm
Has thanked: 7 times
Been thanked: 1 time

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

Gửi bài by thanhme16 »

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: Thứ 4 12/01/2011 6:43 am

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

Gửi bài by phongtieutu »

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 10879 lần
hapvn
Thành viên chính thức
Thành viên chính thức
Bài viết: 32
Ngày tham gia: Thứ 7 04/07/2009 5:50 pm
Has thanked: 2 times
Been thanked: 6 times

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

Gửi bài by hapvn »

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: Thứ 3 11/06/2013 1:42 am
Has thanked: 1 time

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

Gửi bài by thiensonhoakich »

Rất Hay. Cảm ơn rất nhiều ^^
thiensonhoakich
Bài viết: 2
Ngày tham gia: Thứ 3 11/06/2013 1:42 am
Has thanked: 1 time

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

Gửi bài by thiensonhoakich »

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: Thứ 7 02/01/2010 10:23 am
Has thanked: 20 times
Been thanked: 2 times

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

Gửi bài by thuyan1990 »

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: 32
Ngày tham gia: Thứ 7 04/07/2009 5:50 pm
Has thanked: 2 times
Been thanked: 6 times

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

Gửi bài by hapvn »

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: Thứ 2 11/03/2013 3:48 pm
Has thanked: 8 times
Been thanked: 1 time

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

Gửi bài by nghiaducon »

ai cho em xin cái demo bên VB.net với
Đăng trả lời

Quay về