.net延遲加載的一般實(shí)現(xiàn)
本文對(duì)延遲加載在常用控件的實(shí)現(xiàn)做簡單的描述。
一、在界面次顯示時(shí)加載最簡單的延遲加載可以通過控件次顯示時(shí)加載數(shù)據(jù),例如你有很多的頁簽,只有用戶切換到這個(gè)頁簽時(shí),才會(huì)加載數(shù)據(jù)。在.NET的Control中提供SetVisibleCore虛方法,當(dāng)檢測value是true且次調(diào)用此方法時(shí),調(diào)用延遲加載。但是我并不推薦這個(gè)方法,因?yàn)槟阌懈玫牡胤健#?如果你的控件繼承自Form或者UserControl,建議重載OnLoad;- 如果繼承自Control,可以重載OnCreateControl。下面是延遲加載數(shù)據(jù)的例子: public class MyTabPage : TabPage { protected override void OnCreateControl() { base.OnCreateControl();
string oldText = this.Text; this.Text = "Loading..";
//TODO:在這里調(diào)用加載數(shù)據(jù)的方法
this.Text = oldText; } }二、樹控件在次展開時(shí)加載TreeView因?yàn)樗械墓?jié)點(diǎn)并不是繼承自Control,所以不能使用上面的方式,但是TreeView提供了OnBeforeExpand虛方法,最簡單的辦法是在你打算實(shí)現(xiàn)延遲加載的節(jié)點(diǎn)加入一個(gè)是否已經(jīng)加載的標(biāo)記,當(dāng)次展開時(shí),檢測這個(gè)標(biāo)記。必須記住你的延遲加載節(jié)點(diǎn)在根位置是不能收到這個(gè)事件的。
三、在表格中延遲加載。在Windows程序中,有的使用分頁的方式實(shí)現(xiàn)延遲加載,但這種方式的用戶體驗(yàn)非常的糟糕。如果你希望仍然使用滾動(dòng)條的話,可以自己實(shí)現(xiàn)IBindList接口,內(nèi)部持有一個(gè)數(shù)據(jù)的ID列表,在表格詢問數(shù)據(jù)時(shí),才到數(shù)據(jù)庫加載數(shù)據(jù),通常的表格控件都能夠很好的工作。但這里有個(gè)應(yīng)該注意的地方,例如用戶按下PageDown時(shí),表格控件連續(xù)的調(diào)用獲取數(shù)據(jù)方法,如果每次請(qǐng)求都去調(diào)用數(shù)據(jù)庫,將會(huì)很低的性能,應(yīng)該讓你的程序“預(yù)知”到可能要讀下50筆數(shù)據(jù)了,所以一次性多讀50條可以。 這種方法遇到表格排序的時(shí)候沒有辦法了。
以上是延遲加載技術(shù)的一般技術(shù),如果你有更好的方法,請(qǐng)指教