c# BindingSource 類

 

1.引言 數據庫

   

BindingSource組件是數據源和控件間的一座橋,同時提供了大量的API和Event供咱們使用。使用這些API咱們能夠將Code與各類具體類型數據源進行解耦;使用這些Event咱們能夠洞察數據的變化。 ide

2.簡單綁定 函數

   

        DataTable  myTable  =  myTableAdapter.GetData();//建立Table 學習

   

        BindingSource  myBindingSource=  new  BindingSource();//建立BindingSource spa

   

        DataGridView  myGrid  =  new  DataGridView();//建立GridView orm

   

        myGrid.DataSource  =  myBindingSource;//將BindingSource綁定到GridView 對象

   

        myTable;//綁定數據到BindingSource 排序

   

        注: 接口

   

        1)綁定到DataTable,實際上是綁定到DataTable提供的DataView上。每一個DataTable都有一個缺省的DataView 事件

   

        2)DataView是綁定的實質,正如其名,它是DataTable的數據的展示。所以能夠對同一個DataTable

   

        ,構建多個DataView,進而能夠對這一樣的數據實施不一樣的過濾、排序等方法,從不一樣側面展現DataTable。這也體現了必定的MVC思想。

   

        3)BindingSouce也可做爲數據(實際上是數據引用)的容器在不一樣窗體間傳遞,從而實如今彈出窗體中對數據的編輯 

   

3.主細表

   

        image

   

        以上圖所示數據爲例:

   

        1)DataSet:myDataSet

   

        2)DataTable:ParentTable、ChildTable、GrandChildTable

   

        3)Relation:FK_Parent_Child、FK_Child_GrandChild

   

        //綁定父數據

   

        parentBindingSource.DataSource  =  myDataSet;

   

        parentBindingSource.DataMember  =  "ParentTable";

   

        m_GrandParentGrid.DataSource  =  m_GrandParentBindingSource;

   

        //綁定子數據。

        childBindingSource.DataSource  =  parentBindingSource;//綁定到"父BindingSource",而不是父Table

   

        childBindingSource.DataMember  =  "FK_Child_GrandChild";//綁定到"父-子Relation"

   

        //綁定孫子數據。

        grandChildBindingSource.DataSource  =  childBindingSource;//綁定到"子BindingSource"

   

        grandChildBindingSource.DataMember  =  "FK_Child_GrandChild";//綁定到"子-孫Relation"

   

這樣你就能夠在Form上擺上3個DataView,分佈綁定到這3個BindingSouce,很容易就實現了主細表關聯展示。

4.數據操縱

要操縱數據,首先須要獲取當前數據項。BindingSource的Current屬性返回DataRowView類型的對象(就像DataView是對  DataTable的封裝同樣,DataRowView是對DataRow的封裝),它是對當前數據項的封裝,能夠經過類型轉換變成你想要的對象。

   

        DataRowView  currentRowView  =  myBindingSource.Current;//獲取當前RowView

   

        CustomersRow  custRow  =  currentRowView.Row  as  CustomersRow;//類型轉換爲當前數據項

   

        string  company  =  custRow.CompanyName;//使用當前數據項

   

        string  phoneNo  =  custRow.Phone;

   

5.用BindingSource作數據容器

   

BindingSource還能夠用做數據容器,即使它沒有綁定到數據源上,它內部有一個能夠容納數據的list。

5.1Add方法

   

調用Add方法會在BindingSource的list中插入數據項。若是這時第一次插入數據,而且沒有綁定數據,那麼插入數據的類型就決定了從此此list中數據的類型。

   

        注:

   

        1)此時再插入其它類型對象會拋出InvalidOperationException異常

   

        2)設置DataSource屬性時會刷新list,形成Add方法添加到list中的數據丟失

   

5.2AddNew方法

   

AddNew方法返回BindingSourc所容納數據類型的對象;若是以前沒有容納數據,則會返回Object對象。

   

AddNew方法會調用EndEdit方法,並將提交對當前數據的操縱;而後新數據項就成爲當前項。

   

AddNew方法會引起AddingNew事件,能夠在此事件中爲數據項賦值,或者建立新數據項

   

        private  void  OnAddingNew(object  sender,  AddingNewEventArgs  e)

        {

                    e.NewObject  =  new  MyCustomObject();//

        }

   

6.用BindingSource對數據排序、過濾、搜索

6.1  Sort

   

爲Sort屬性賦上Sort表達式,能夠對數據進行排序

   

        myBindingSource.Sort  =  "ContactName  ASC";//對ContanctName列按ASC進行排序

   

        myBindingSource.Sort  =  "Region  ASC,  CompanyName  DESC"//先按Region、再按CompanyName排序

   

6.2  Find

   

        Find方法根據指定屬性和關鍵字進行查找,並返回第一個匹配對象的Index

        int  index  =  m_CustomersBindingSource.Find("CompanyName",IBM);//按CompanyName查找IBM

        if  (index  !=  -1)

        {

                myBindingSource.Position  =  index;//定位BindingSource

        }

   

6.3  Filter

   

爲Filter屬性賦上表達式,能夠對數據進行過濾

   

        m_CustomersBindingSource.Filter  =  "Country  =  'Germany'";//過濾出Country屬性爲Germany的數據

   

7.用Event監控數據

7.1  Event

   

        1)AddingNew

   

        調用AddNew()方法時觸發。

   

        2)BindingComplete

   

        當控件完成數據綁定時觸發,說明控件已經從數據源中讀取當前數據項的值。當BindingSource從新綁定或當前數據項改變時,會觸發此事件

   

        注:

   

                *  當有多個控件綁定到同一數據源時,這個事件會觸發屢次

   

        3)CurrrentChanged

   

        當前數據項改變時觸發此事件。觸發此事件的狀況以下

   

                *  Position屬性改變時

                *  添加、刪除數據時

                *  DataSource或DataMember屬性改變時

   

        4)CurrentItemChanged

   

        當前數據項的值改變時觸發

   

        5)DataError

   

        一般輸入無效數據時,由CurrencyManage拋出異常,從而觸發此事件。

   

        6)PositionChanged

   

        Position屬性改變時觸發此事件。

   

        7)ListChanged

   

        數據集合改變時觸發。觸發此事件的狀況以下

   

                *  adding,  editing,  deleting,  或  moving  數據項時

   

        改變那些會影響List行爲特徵的屬性時,如AllowEdit屬性

   

                *  替換List時(綁到新數據源)

   

8.限制數據修改

   

BindingSource不只是數據源與控件間的"橋樑",同時也是數據源的"看門人"。經過BindingSource,咱們能夠控制對數據的修改。

   

BinidingSource的AllowEdit,  AllowNew和AllowRemove屬性能夠控制客戶端代碼和控件對數據的修改

9.複雜數據類型的Binding

   

對於String類型的數據,直接Binding到Text控件便可,對於複雜類型有下面幾種狀況

   

        *  對於DateTime、Image等類型的數據,它們存儲的格式與顯示要求並不一致。

        *  有時,你並不想顯示客戶ID,而是但願顯示客戶名稱

        *  數據庫中的Null值

   

9.1  Binding類

   

解決以上問題的關鍵是要理解Binding類,瞭解它是如何控制數據Binding的過程。

   

        DataTable  table  =  customersDataSet.Customers;

   

        //將TextBox的Text屬性Binding到table的CustomerID列

        customerIDTextBox.DataBindings.Add("Text",  table,"CustomerID",  true);

   

        //上面一行代碼等同下面兩行代碼

   

        Binding  customerIDBinding  =  new  Binding("Text",  table,"CustomerID",  true);

        customerIDTextBox.DataBindings.Add(customerIDBinding);

   

從代碼能夠看出,Binding是數據源(table)和控件(customerIDTextBox)間的中介人,它有如下功能

   

        *  從數據源取數據,並按照控件要求的數據類型對此數據進行格式化(Formatting),而後傳給控件

        *  從控件取數據,並按照數據源的數據類型要求對此數據進行解析(Parsing),而後返回給數據源

        *  自動對數據進行格式轉換

   

9.2Binding類構造函數和屬性

   

Binding構造函數有多個重載版本,下面介紹其重要的參數,這些參數同時存在於Binding對象的屬性中。下面介紹中,參數名和屬性名都列出來

   

        1)formattingEnabled(屬性FormattingEnabled)

   

                    o  true,Binding對象自動在數據源類型和控件要求的類型間進行轉換

                    o  false,反之

   

        2)dataSourceUpdateMode

   

        決定控件上數值的改變在什麼時候提交回數據源

   

        3)nullValue

   

        DBNull、  null和Nullab<T>對應的值。

   

        4)formatString

   

        格式轉換

   

        5)formatInfo

   

        一個實現IFormatProvider接口的對象引用,用來自定義格式轉換

   

要了解類型如何轉換的,請學習Type  Conversions  and  Format  Providers相關內容。關於上面屬性的應用,請看下面介紹

9.3基於Binding類的內置機制(屬性、參數)進行類型轉換

   

經過Binding類構造時的參數,或屬性設置,能夠控制它進行類型轉換的機制。

   

1)DateTime

   

下面先介紹一個DateTime類型的例子,使用DateTimePicker控件

   

        //建立Binding,設置formattingEnabled爲true

   

        birthDateTimePicker.DataBindings.Add("Value",m_EmployeesBindingSource,  "BirthDate",  true);

   

        //設定爲使用自定義格式

        birthDateTimePicker.Format  =  DateTimePickerFormat.Custom;

   

        //設定格式

        birthDateTimePicker.CustomFormat  =  "MM/dd/yyyy";

   

2)Numeric

   

        salaryTextBox.DataBindings.Add("Text",  employeesBindingSource,"Salary",

相關文章
相關標籤/搜索