使用DataCombo和DataList控件
DataCombo和DataList控件與標准列表框和組合框控件極為相似,但有一些重要的不同之處,這種不同使這兩個控件在數據庫應用程序中具有極大的適應性和用武之地。這兩個控件都可以被這些控件所綁定的數據庫字段自動填充。此外,它們還能有選擇地將一個選定的字段傳遞給第二個數據控件,從而適合用於創建“查找表”應用程序。
可能的用法
1.在一個關系數據庫中,使用一個表的數據來提供要輸入給第二個(相關的)表值。例如,在一個存貨清單數據庫中,供應商的名稱存儲在一個表中,每個供應商都有一個唯一的標識符。另一個顯示產品的表則使用這些標識符來表明是哪個供應商供應的該產品。可以使用DataList控件來顯示供應商的名稱,而(不可見地)將供應商的標識符提供給產品表。
2.允許用戶通過從一個下拉列表中選擇一種標准來縮小搜索范圍。例如,一個銷售報告的數據庫應用程序可以使用一個DataList控件讓用戶選擇一個州(State)或一個銷售區域。一旦作出選擇,則該選擇項將自動傳遞給第二個數據控件,這個控件負責查找選定區域的銷售記錄。
與它們對應的內在控件一樣,DataList和DataCombo控件之間的主要不同在於DataCombo控件提供了一個可以在其中編輯內容的文本框。
詳細信息有關DataList和DataCombo控件連接數據庫表能力的說明,請參閱“使用DataCombo和DataList控件連接兩個表”。要創建一個簡單的使用鏈接表的數據庫應用程序,請參閱“創建一個簡單的DataCombo應用程序”。
值得注意的控件屬性
DataList和DataCombo控件的一些重要屬性包括:
注意DataCombo控件的DataFormat屬性是一個Extender屬性。因此在屬性表上它總是可見的,並且可以在代碼中設置。然而,DataCombo控件僅對其列表中最上端的項格式化。對於看到已格式化的頂端項的最終用戶來說,這一點可能不太重要,只要從未格式化的列表中選擇即可。已格式化的項可能也會誤導最終用戶,使他們以為項目要在格式化之後再輸入數據庫。由於這些原因,建議在使用DataCombo控件時不要設置DataFormat屬性。
詳細信息如果要使用一個演示BoundText屬性用法的循序漸進教程,請參閱“創建一個連接DataList控件的DataGrid”。關於這些控件的屬性和方法的完整列表,請參閱“DataList控件”和“DataCombo控件”。
使用DataCombo和DataList控件連接兩個表
DataCombo和DataList控件與眾不同的特性是具有訪問兩個不同的表,並且將第一個表的數據鏈接到第二個表的某個字段的能力。這是通過使用兩個數據源完成的(諸如ADOData控件或Data環境)。
關系表和“不友好的”值
在一個關系數據庫中,對於重復使用的信息並不是在多個地方都保存其全部的信息。大多數這種信息都保存在由多個字段組成的一個記錄集中;在這些字段中有一個“標識符”字段來唯一地標識這個記錄集。例如,VisualBasic提供的Biblio數據庫在一個名為"Publishers"的表中存儲了若干個出版公司的名稱。這個表包括很多字段,諸如地址、城市、郵政編碼以及電話號碼等。但是為了簡單起見,只考慮這個表的兩個本質字段Name和PubID字段。Name字段存儲一個出版商的名稱,而PubID字段則存儲一個相對“不友好的”值,如一個數或代碼。但這個不友好的值是很重要的,因為這個值唯一地標識該出版商,並且可以作為一種鏈接整個記錄集的手段。此外,這個值會存儲在第二個表中的多個記錄集中。
第二個表的名稱為"Titles",其每個記錄集包含的信息包括標題、出版年份、國際標准書號ISBN等。在這些字段中有一個字段的名稱就是"PubID"。這個字段的名稱與Publishers表中的相應字段的名稱相同,因為這個字段存儲了將該標題和一個特定的出版商鏈接在一起的值。
這種可行方案提出了一個小問題:給定一個允許用戶插入新標題的數據庫應用程序,用戶必須用某種方法輸入標識出版商的整數。如果用戶能記住每個出版商的唯一標識符,那麼也還是可行的,不過如果一方面用戶能看到出版商的名稱,另一方面存入應用程序的又是數據庫中相應的值,則會顯得更加方便。而DataList和DataCombo控件就可以輕松地解決這個問題。
兩個數據源、三個字段、無編碼
DataList和DataCombo控件使用兩個數據源來解決這個問題。在只顯示出版商的名稱(來自Publishers表)的同時,DataList或DataCombo控件只將PubID字段的值寫入到Titles表。通過“屬性”窗口,將RowSource設置為提供要寫入的數據的數據源(即Publishers表)。然後將DataSource屬性設置為要寫入數據的數據源(即Titles表)。最後,設置DataField、ListField以及BoundColumn屬性。下圖演示了如何將兩個數據源(以兩個Data控件的形式)以及三個字段指定給一個DataCombo控件:
簡要而言,ListField屬性決定該控件所顯示的是哪一個字段。在本例中就是出版商的名稱。另一方面,BoundColumn屬性則決定Publishers表中由哪一個字段向Title表供應實際所需的值。注意Publishers表中的PubID字段不能(也不應該)被編輯。相反,在PubID字段中的值將寫入到由DataField屬性所指定的字段。在本例中,這個屬性就是Titles表中的PubID字段。
下表概要地介紹這些屬性及其使用方法。
注意DataList和DataCombo控件也可以與單個數據控件一起使用。要實現這一點,可以將DataSource和RowSource屬性設置為同一個數據控件,並且將DataField和BoundColumn屬性設置為該數據控件的記錄集中的同一個字段。在這種情形下,將使用ListField的值來填充該列表,且這些值來自於被更新的同一個記錄集。如果指定了一個ListField屬性,但沒有設置BoundColumn屬性,則BoundColumn將自動被設置為ListField字段。
詳細信息如果想使用DataCombo控件循序漸進地創建一個簡單的數據庫應用程序,請參閱“創建一個簡單的DataCombo應用程序”。