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", |