【功能說明】
用途:使用於Client端,繼承自BindingSource元件,與InfoDataSet或者CacheDataSet配合使用。用於建立各UI資料元件與InfoDataSet資料表間的連接,並透過本元件來進行對InfoDataSet的各種資料操作。
【元件屬性】
Name(名稱)(string)
元件名稱,用於識別該元件。
AutoApply(自動存檔)(bool)
設為True時,在執行EndEdit()單筆確認功能時,會讓InfoDataSet自動執行ApplyUpdate()的動作,也就是每編輯一筆BindingSource的資料並確認後,即要自動讓InfoDataSet存檔到Server端一次,此目的是為了能更即時將U/I的資料存檔到資料庫中。如配合InfoNavigator元件時,按下Ok按鈕時,就會直接將資料儲存到後端資料庫中,如果設為False,則需要按下Apply才會執行資料的儲存。一般在InfoDataSet有Master/Detail的情況下,對Master一般都是設為True的,但如果是Detail則都是設為False。
AutoApplyMaster(自動表頭存檔)(bool)
此專門應該在Master/Detail的架構上,當新增Master後,並在輸入Detail前是否要先將Master進行Apply存檔,此應用在Master的主鍵為自增值欄位(每次自動加一),所以要配合
AutoApplyMaster=True來強迫Master存檔並取回鍵值後,才能正確對Detail輸入資料。
AutoDisableControl(自動失能控制)(bool)
True/False,可依據當前資料的編輯狀態,自動控制到連接此BindingSource各UI資料元件的致能與失能狀態。為True代表一般情況下,各UI資料元件是處於失能的狀態下,就是不能讓User編輯;除非配合InfoNavigator的Edit功能或執行BeginEdit()方法,才會讓各UI資料元件進入致能狀態讓User編輯。如設為False,系統將不會對各UI資料元件做任何致能與失能的控制。
AutoDisableStyle(自動失能控制樣式)(Srvtools.InfoBindingSource.AutoDisableStyleType)
自動失能控制樣式,有Enable和ReadOnly兩種。
CloseProtect(關閉保護)(bool)
用來保護資料在編輯狀態下防止使用者關閉視窗,當設為True時,如果對應到本InfoBindingSource的資料有被異動且尚未存檔到後端時,則會提示給User並禁止關閉視窗,為False則不保護此行為。
DataMember(資料成員)(string)
對應的資料表名稱,此可以對應到一個DataSet資料集中的某一個Table (因為一個DataSet會有多個Table的內容);本屬性要搭配DataSource共同使用,不能單獨使用。
DataSource(資料源)(DataSource)
對應的資料集,一般對象是DataSet,與DataMember配搭使用,當DataSource指向DataSet時,則DataMember就必須設定指向其DataSet內的某一個Table;但是如果DataSet有Master/Detail的關聯關係時,Master可按上述的方式設定,DataSource指向DataSet,DataMember指向DataSet內的Master
Table,但Detail則就不一樣了,DataSource必須指向Master的InfoBindingSource,而非原來的DataSet,DataMember則改指向Master的InfoBindingSource內的Relation1關連表(系統自動建立的關連資料表)。
DelayInterval(延遲時間)(int32)
這個屬性專門給RelationDelay所使用,系統預設是300毫秒,也就是0.3秒,用途請參考RelationDelay。
DisableKeyFields(隱藏主鍵欄位)(bool)
隱藏主鍵欄位。
FocusedControl(焦點元件)
設定在新增或編輯時,進入焦點的Control。
RelationDelay(關聯延遲)(bool)
本屬性是專門給Relations 動態關連所使用,設定是否開啟關聯延遲。因為Relations會在User移動資料時,對另外的DataSet請求顯示相對資料,因Relations是動態取資料,因此會引發對方的DataSet向後端請求資料下載,所以當User在原始的InfoBindingSource的DataGridView中快速移動資料時,將會引發DataSet過多的資料下載,使用RelationDelay可以延遲DataSet對A/P
Server請求資料的時間,延遲時間則在DelayInterval定義之,也就是每User移動一筆,除非停留DelayInterval的時間,否則對方的DataSet不會去下載資料,如此將可以大幅加速User對DataGridView操作的反應時間,增加系統的效能。
Relations(關聯明細)(Collection)
設定本InfoBindingSource與其他DataSet的關聯關係。可以定義與多個DataSet的關係,每個Relation的屬性說明如下:
RelationDataSet(關聯的資料集)(DataSet):所要關聯的資料集,當InfoBindingSource每移動一筆資料時,都會引發此DataSet重新下載一次資料。
SourceKeyFields(來源關聯主鍵)(string):設定本InfoBindingSource要與其他DataSet去關聯時的主鍵,可設定多個欄位。
TargetKeyFields(目的關聯主鍵)(string):設定對方DataSet
的關聯主鍵,也可設定多個欄位,但應與SourceKeyFields
裡設定的欄位數量相同,保持一對一的對應,並且依次序對
應。
Active(啟用)(bool):是否開啟Relation,可以利用此屬性暫時關閉關連關係。
AllowAdd(允許新增) (bool)
是否允許此BindingSource新增資料,用來配合InfoSecurity的功能,控制那些群組可以有權限使用這些功能。
AllowDelete(允許刪除) (bool)
是否允許此BindingSource刪除資料,用來配合InfoSecurity的功能,控制那些群組可以有權限使用這些功能。
AllowUpdate(允許更改) (bool)
是否允許此BindingSource更改資料,用來配合InfoSecurity的功能,控制那些群組可以有權限使用這些功能。
AllowPrint (允許印表) (bool)
是否允許此BindingSource列印資料(指InfoNaivagor的「Print」的Buttons是否可以執行),用來配合InfoSecurity的功能,控制那些群組可以有權限使用這些功能。
【事件】
AddingNew(新增前)
在新增時觸發。
AfterDelete(刪除後)
在刪除以後觸發。
AfterEdit(編輯後)
在編輯完成後觸發。
BeforeEdit(編輯前)
在編輯時觸發。
BindingComplete(綁定後)
在與DataSet進行完資料的綁定之後時觸發。
CurrentChanged(當前值改變後)
在當前一筆的值改變後觸發。
CurrentItemChanged(當前項改變後)
在當前項的屬性值改變後觸發。
ListChanged()(資料移動後)
在資料有移動後時觸發。
PositionChanged()(資料移動後)
在資料有移動後時觸發。
AllowProperyChanged(當InfoBindingSource中的所有Allow類屬性變化後)
在InfoBindingSource的AllowAdd,AllowUpdate,AllowDelete以及AllowPrint的屬性值有變化時觸發
【功能函數】
AddNew()
對目前InfoBindingSource所對應的資料進行新增的動作。
BeginEdit()
對目前筆資料進行編輯的動作。
EndEdit()
對目前筆資料進行編輯確認的動作,如果AutoApply=True時,此功能會讓DataSet引發Apply的動作。
CancelEdit()
對目前筆資料取消編輯的動作。
MoveFirst()
讓資料移動到首筆。
MoveLast()
讓資料移動到末筆。
MoveNext()
讓資料移動到下筆。
MovePrevious()
讓資料移動到上筆。
RemoveCurrent()
對目前筆資料進行刪除的動作。
Refresh()
讓對應的DataSet重新到Server上讀取最新的資料下來。並能重新定位到原來那一筆資料。
ResumeBinding()
對DataSet重新進行資料綁定的動作。
SuspendBinding()
對DataSet進行取消資料綁定的動作。
【其他說明】
其實在設計資料編輯時,各UI資料編輯元件可透過InfoDataSet直接與Table相互綁定,但在EEP中不建議這樣使用,而必須透過InfoBindingSource與InfoDataSet連接使用,這是因為EEP的很多U/I元件都是以InfoBindingSource為基礎做一些基本控制,尤其是RefVal與InfoNavigator等元件更是與InfoBindingSource息息相關,因此在開發上須密切的配合。
【範例】
以下是從InfoBindingSource中取欄位值的方法:
ibsDetail.MoveFirst();
while (ibsDetail.Position+1<= ibsDetail.Count) // 沒有eof的旗幟,所以要使用Count來判斷
DataRowView dr =
(DataRowView)ibsDetail.Current;
MessageBox.Show(dr.Row["ProductID"].ToString());
int oldPos = ibsDetail.Position;
ibsDetail.MoveNext();
if
(ibsDetail.Position == oldPos) break; //
Position一樣代表沒有資料了
}
以下是從InfoBindingSource中自行新增資料的方法:
ibsDetail.AddNew(); //新增
DataRowView dr = (DataRowView)ibsDetail.Current; //取出DataRow Object,對DataRow進行處理
dr.Row["ProductID"] = 12;
dr.Row["Quantity"] = 10;
dr.Row["UnitPrice"] = 10;
dr.Row["Discount"] = 1;
ibsDetail.EndEdit();
// 確定欄位的設值
以下是從InfoBindingSource中自行刪除資料的方法:
{
//ibsDetail.RemoveAt(ibsDetail.Position); //這樣寫也可以.
ibsDetail.RemoveCurrent();
}