2014-01-12 90 views
0

足夠簡單的問題,我將如何能夠將ListView上的行數量限制爲實際包含信息的項目/行數量。我知道如何使用這個代碼在列表視圖中限制行數

ListView1.Items.Count 

但我怎麼能限制列表視圖擁有的項目數量行的量來算的項目行?

+0

你能限制你提供給ListView的項目數嗎?過濾出列表中不爲空的任何項目並將其用作傳遞給ListView的列表? – karkum

+0

@karkum listview由一個SQL表填充,所以它應該只接收表中的許多行 - 目前這兩行用於測試目的。但是我的列表視圖在包含信息的兩行下面包含更多行...... – user2980316

+0

「列表視圖由一個SQL表填充,因此它應該只接收表中的許多行」不!你應該*不*從數據庫中簡單地獲取所有數據,修改查詢以便返回實際想要顯示的數據,僅此而已。或者在最低限度,過濾數據而不是簡單地顯示整個結果集。 – Alejandro

回答

0

假設包含LINQ(3.5+)的.Net版本,您會得到一些非常好的功能,這些功能非常有用。這適用於任何IQueryable包括IList ..

Dim MyList = [Some code to get hundreds of items] 

Dim MyShortList = MyList.Take(30) 

您還可以通過使用Skip實現分頁很容易...

Dim MyShortListPage2 = MyList.Skip(30).Take(30) 

你應該考慮使用實體框架或等價物實現IQueryable。這些通過使用延遲處理即延遲加載來減少內存開銷。

總之,如果我是做使用EF如下:

Dim Users = DBContext.Set(Of Users) 

Users實際上不會包含所有用戶在數據庫中,而是將包含查詢讓所有用戶。如果我做了Users.First,它會運行SQL查詢來獲取第一個用戶。相反,如果我做了Users.Where(function(x) x.Age=30).First它只會查詢第一個年齡爲30歲的用戶的SQL。

因此,IQueryable允許您使用底層提供程序的功能快速削減數據集,而不是在內存中執行它。

相反,如果我做了

Dim Users = DBContext.Set(Of Users).ToList() 

它將從數據庫中檢索所有用戶到內存中。 ToList()是迫使這發生。 A List必須存儲在本地內存中,IQueryable不會,它可以在最後可能的時刻運行適當的查詢並儘可能少地滿足您的請求。

您是否希望發生這種情況取決於用例。