国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

轉貼自MS:擴展 TreeView 控件 (1)

2024-07-21 02:24:18
字體:
來源:轉載
供稿:網友
windows 窗體控件開發示例
duncan mackenzie
microsoft developer network
2002 年 5 月

摘要:講述了如何向 treeview 控件添加數據綁定功能,它是一系列 microsoft windows 控件開發示例之一。您可以將本文與相關的概述文章結合起來閱讀。
您可以從 msdn code center 下載 winformcontrols.exe(英文)源代碼。(請注意,在示例文件中,程序員的注釋使用的是英文,本文中將其譯為中文是為了便于讀者理解。)
本文是介紹如何在 microsoft® .net 中開發控件的系列文章中的第四篇(共五篇):
  • developing custom windows controls using visual basic .net (overview)(英文)
  • adding regular expression validation(英文)
  • combining multiple controls into one(英文)
  • 擴展 treeview 控件
  • drawing your own controls using gdi+(英文)

目錄

  • 簡介
  • 設計數據綁定樹視圖
  • 實現數據綁定
  • 使用 currencymanager 對象
  • 將 datasource 轉變為樹
  • 示例應用程序
  • 小結

簡介


在可能的情況下,您應該先使用些現成的控件;因為提供的 microsoft® windows® 窗體控件中包含大量編碼和測試成果,如果您要放棄它們從頭開始,無疑是一種巨大的浪費。基于此,在本例中,我將繼承一個現有 windows 窗體控件 treeview ,然后對其進行自定義。在下載該 treeview 控件的代碼時,您還會得到附加的控件開發示例,以及一個演示如何與其他數據綁定控件一起使用該增強 treeview 的示例應用程序。

設計數據綁定樹視圖


對于 windows 開發人員來說,向 treeview 控件添加數據綁定是經常會遇到的問題,但由于 treeview 和其他控件(如 listboxdatagrid)存在一個主要差別(即 treeview 顯示分層數據),因而基本控件目前還不支持此功能(也就是說,我們還必須使用它)。給定一個數據表,您就會很清楚如何在 listboxdatagrid 中顯示該信息,但利用 treeview 的分層特點來顯示同樣的數據就不那么簡單明了。就個人而言,我在使用 treeview 顯示數據時曾應用過許多不同的方法,但有一種方法最常用:按某些字段將表中的數據分組,如圖 1 所示。

圖 1:在 treeview 中顯示數據
在本例中,我將創建一個 treeview 控件,在該控件中可傳遞一個平面數據集(如圖 2 所示),并可輕松地生成圖 1 所示的結果。

圖 2:平面結果集,包含創建圖 1 所示的樹所需的所有信息
在開始編碼之前,我為新控件想出了一個可以處理該特定數據集的設計,并希望它能夠適用于許多其他類似的情形。添加一個足可以使用大多數平面數據創建分層結構的組集合,在該集合中為每一級分層均指定一個分組字段、顯示字段和值字段(任一或所有字段均應相同)。為了將圖 2 所示的數據轉變成圖 1 所示的 treeview,我的新控件要求您定義兩個分組級別 publisher 和 title,并將 pub_id 定義為 publisher 組的分組字段,將 title_id 定義為 title 組的分組字段。除分組字段以外,還需要為每個組指定顯示和值字段,以確定在相應組節點上顯示的文本以及用來唯一標識特定組的值。當遇到此類數據時,請使用 pub_name/pub_idtitle/title_id 作為這兩個組的顯示/值字段。作者信息將變成樹的葉節點(分組分層結構末端的節點),您還需要為這些節點指定 id (au_id) 和顯示 (au_lname) 字段。
構建自定義控件時,在開始編碼之前確定程序員對該控件的使用方法將有助于提高控件的使用效率。這種情況下,我希望程序員(在給定了前面所示的數據和所需結果的情況下)能夠使用如下幾行代碼完成分組:
        with dbtreecontrol            .valuemember = "au_id"            .displaymember = "au_lname"            .datasource = mydatatable.defaultview            .addgroup("publisher", "pub_id", "pub_name", "pub_id")            .addgroup("title", "title_id", "title", "title_id")        end with
注意:這并不是我最終編寫的代碼行,但兩者相差不多。在開發控件的過程中,我意識到需要將與 treeview 關聯的 imagelist 中的圖像索引與每個分組級別相關聯,因此必須向 addgroup 方法中額外添加一個參數。

為了真正構建該樹,我將瀏覽數據并查找字段(指定為每個分組的分組值)的更改,同時在必要時創建新分組節點,并針對每個數據項創建一個葉節點。由于存在分組節點,因此總節點數將大于數據源中的項目數,但基礎數據中的每個項有且僅有一個葉節點。

圖 3:分組節點與葉節點
葉節點和分組節點之間的區別(如圖 3 所示)對本文的余下部分具有重要意義。我決定將這兩類節點區別對待,為每一類節點分別創建自定義節點,并根據所選的節點類型引發不同的事件。

實現數據綁定


為該控件編寫代碼的第一步是創建項目和相應的起始類。在本例中,我首先創建一個新 windows 控件庫,然后刪除默認的 usercontrol 類,并用一個從 treeview 控件繼承的新類來代替它:
public class dbtreecontrol    inherits system.windows.forms.treeview

從這時起,我將設計一個可以放入到窗體中的控件,并使其具有常規的 treeview 的外觀和功能。下一步是開始添加旨在處理在 treeview 中加入的新功能所需的代碼,即數據綁定和分組數據。

添加 datasource 屬性


我的新控件的所有功能都很重要,但構建復雜數據綁定控件的兩個關鍵問題是處理 datasource 屬性和從數據源的每個對象中檢索單個項目。

創建屬性例程


首先,任何用于實現復雜數據綁定的控件都需要實現一個 datasource 屬性例程,并保持適當的成員變量:
private m_datasource as object<category("data")> _public property datasource() as object    get        return m_datasource    end get    set(byval value as object)        if value is nothing then            cm = nothing            groupingchanged()        else            if not (typeof value is ilist or _                      typeof value is ilistsource) then                ' 不是針對該用途的有效數據源                throw new system.exception("無效 datasource")            else                if typeof value is ilistsource then                    dim mylistsource as ilistsource                    mylistsource = ctype(value, ilistsource)                    if mylistsource.containslistcollection = true then                        throw new system.exception("無效 datasource")                    else                        ' 對,對。它是有效的數據源                        m_datasource = value                        cm = ctype(me.bindingcontext(value), _                            currencymanager)                        groupingchanged()                    end if                else                    m_datasource = value                    cm = ctype(me.bindingcontext(value), _                        currencymanager)                    groupingchanged()                end if            end if        end if    end setend property

ilist 接口


可用作復雜數據綁定數據源的對象通常都支持 ilist interface(英文),該接口將數據公開為對象集合,并提供若干有用屬性,如 count。我的新 treeview 控件要求在其綁定中使用一個支持 ilist 的對象,但使用另一個接口 ilistsource interface(英文)也可以,因為它提供了一個獲取 ilist 對象的簡便方法 (getlist)。當設置 datasource 屬性后,我首先確定是否提供了有效的對象,即一個支持 ilistilistsource 的對象。我真正想要的是 ilist,因此如果對象僅支持 ilistsource(例如 datatable),那么我將使用該接口的 getlist() 方法獲得正確的對象。
某些實現 ilistsource 的對象(如 dataset)實際上包含多個由 containslistcollection 屬性表示的列表。如果該屬性為 true,則 getlist 將返回一個表示列表(包含多個列表)的 ilist 對象。在我的示例中,我決定支持直接連接到 ilist 對象或僅包含一個 ilist 對象的 ilistsource 對象,并忽略需要附加工作來指定數據源的對象,如 dataset
注意:如果要支持此類對象(dataset 或與之類似的對象),您可以再添加一個屬性(如 datamember)來指定用于綁定的特定子列表。

如果提供的數據源有效,則最終結果是創建 currencymanager class(英文)的實例 (cm = me.bindingcontext(value))。由于該實例將用于訪問基礎數據源、對象屬性和位置信息,因此被存儲在局部變量中。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 苏州市| 进贤县| 泰安市| 瓮安县| 惠来县| 缙云县| 武川县| 常德市| 汉沽区| 长葛市| 阳谷县| 新平| 黄山市| 团风县| 乐山市| 景宁| 木里| 左贡县| 色达县| 礼泉县| 苗栗市| 碌曲县| 绿春县| 正安县| 福州市| 肃宁县| 兴仁县| 怀仁县| 股票| 新蔡县| 咸阳市| 衡水市| 涿州市| 金门县| 渝中区| 云林县| 德格县| 方山县| 三穗县| 巴彦淖尔市| 烟台市|