DataSourceManager
如果您設法閱讀所有關於這一點的文章,您已經獲得了我的尊敬:-) 我猜,如果是那樣的話,您一定如饑似渴地希望知道這個小故事的結尾;-)
我們現在來到這個控件最為復雜的部分。在我想要即Bound(綁定)數據源也支持Unbound(非綁定)數據源時,我遇到了麻煩。一旦數據被綁定到DataGridVIEw基控件類,基控件的行為就變得非常難於影響,並且它有它自己的想法的感覺。舉個例子,一旦它是數據綁定的,就不能添加行到網格,這真讓人灰心。
我只看到一個解決的方法,這就是重寫基控件的DataSource屬性而不是簡單地綁定數據到基控件本身。改為:我創建我自己的DataSourceManager類。我必須承認這讓我陷入我所不願的更大的麻煩中去。突然地,我不得不自己實現數據綁定了!倒不是我特別喜歡數據綁定,因為以我粗陋的看法,它基本上完全摧毀了任何層次(體系)結構(architectural layering)概念,使用多個邏輯層並將業務(層)從表現(層)中分離。但是OK,這是另一個話題。另一方面,一旦您只用很少的幾行代碼就可以排序、分組、並繪出整個DataSet(數據集),我必須承認它是相當令人膽寒的。
因此,如果您想要用如DataTable或DataTableVIEw之類的附加數據源,您將不得不做一些編碼。現在,DataSourceManager已被以一種粗糙的方法實現。基本上,它是一個索引器類,它編制數據源的列和行的索引(作為簡單ArrayLists實現),以允許OutlookGrid快速訪問當前的數據。比如,如果您用業務對象綁定一個ArrayList到OutlookGrid,其屬性將被作為列索引(假若這樣,用反射),並且每個對象將被映射到DataSourceManager中的一行。這也意味著當您排序OutlookGrid,實際上,只有DataSourceManager中索引行被排序。
所以,您可以看到DataSourceManager作為OutlookGrid和實際數據之間的一個抽象層(是的,我太喜歡分層了?)。這裡有一個有趣的細節:將OutlookGrid自身作為一個數據源綁定到DataSourceManager是可能的。甚至在您的OutlookGrid被分組後,DataSourceManager將只索引那些沒有分組的行。這使得先前插入網格的非綁定數據的排序和分組非常容易。用這個辦法,我一石二鳥解決了所有綁定和非綁定數據問題(是的,是的,我太愛抽象類、分離業務和表現等等,等等)!
幾點注意
我喜歡在這篇CodeProject文章中總結它們:我想方設法解決了一些問題。比如,繼承於DataGridVIEw控件的方法和事件,以及如何處理數據綁定。總而言之,鼓搗出這個控件並運行之對我來說很是一個挑戰。正如前面所說,OutlookGrid控件遠遠沒有完成,但它對於主要用途來說已完成:就是分組,它用起來極為好用!好了,小節一下,我希望您喜歡閱讀這篇文章,而且它帶給您一些精神食糧和更新的靈感!如果關於這個控件特定主題我沒有講清楚,或者如果您需要更多關於如何處理特定實現的具體信息,或者如果您有一些關於如何實現數據綁定的好點子,請在評論部分寫下您的高見:-)