開發一個優秀的數據綁定不是一件很容易的事情。剛開始的時候走了一些彎路,一直緊緊咬著 DataBoundControl類不放。最終失望之後冷靜下來想到關於DataSource不就是一個數據集合嗎?明白之後,有關數據源的問題基本上也解決了。在整個Multi-ListBox控件開發中,我認為最重要的實際上就是頁面的生命周期的理解,如果您基本上理解了它的話,那麼,基本上,你以後開發一款ASP.NET控件也不是一件很難的事情。我們還是簡單了解開發的思路吧。下面是類的設計圖(跟本文無關的方法和屬性已被我隱藏)
在控件的生命周期中,我們主要需要解決用戶回發頁面的時候保留ListBox的數據源(因為我沒有采用復合控件的方式來開發)。因些,我們需要重寫控件的SaveViewState, LoadViewState二個方法。
ViewStates
1 protected override void LoadViewState(object savedState)
2 {
3 if (savedState != null)
4 {
5 Triplet triplet = (Triplet)savedState;
6 base.LoadViewState(triplet.First);
7 Reflector.InvokeMethod(this.FirstListBox.Items, "LoadViewState", new object[] { triplet.Second });
8 Reflector.InvokeMethod(this.SecondListBox.Items, "LoadViewState", new object[] { triplet.Third });
9 }
10 else
11 {
12 base.LoadViewState(null);
13 }
14 this._stateLoaded = true;
15 }
16
17 protected override object SaveViewState()
18 {
19 if (EnableViewState == false)
20 return null;
21 //啟用控件視圖狀態
22 object x = base.SaveViewState();
23 object y = Reflector.InvokeMethod(FirstListBox.Items, "SaveViewState", null);
24 object z = Reflector.InvokeMethod(SecondListBox.Items, "SaveViewState", null);
25 if ((x == null) && (y == null) && (z == null))
26 {
27 return null;
28 }
29 return new Triplet(x, y, z);
30 }
為了省事,我沒有自定義ListItem類,改為直接使用ListItemCollection來存儲數據。因為MS沒有提供ListItemCollection. SaveViewState和LoadViewState,我們必須采用反射的方式來調用這二個方法來保存數據。很讓人郁悶。每當到緊要關頭,就會發現MS寫的類,方法不是internal,就是sealed。無可奈何~當然,你也可以自己寫一個類來代替ListItem類.