text1.DataBindings.Add( new Binding("Text", ds, "customers.custNo") );
就可以把 text1 這個控制項的 Text 屬性繫結到 ds.Tables["customers"] 的 custNo 欄位上。
如果想要有一些處理與變化,那麼可以透過 Binding.Format 與 Binding.Parse:
Binding b=new Binding("Text", ds, "customers.custOrder.OrderAmount");
b.Parse+=new ConvertEventHandler( currencyStringToDecimal); // currencyStringToDecimal 是自訂的
b.Format+=new ConvertEventHandler( DecimalToCurrencyString ); // DecimalToCurrencyString 也是...
text3.DataBindings.Add(b);
這表示在轉換控制項屬性到資料來源的時候,會透過這兩個事件作變化。
Parse 表示控制項到資料來源,而 Format 正好相反。
都繫結上了以後呢?我們可以透過 BindingManagerBase 來作巡覽。
BinderManagerBase bm = BindingContext[ dataset, "tablename" ];
此時可用 bm.Position 取得位置,bm.Current 取得當前的物件(如果資料來源是 datatable,那就是 DataRowView;若是陣列,那就是所指向的元素)
bm.Position+1 就是下一筆,反之則是上一筆。到了最後一筆的時候,bm.Position+1 以後仍然會是一樣。
那麼,位置移動的時候會觸發甚麼事件?PositionChanged。所以我們可以撰寫自己的處理事件,
PositionChanged+=new EventHandler( this.fmMain_PositionChanged )
不僅僅是 TextBox 可以作,只要有提供 DataBindings 屬性的控制項都可以。
把 Button 的 Text 屬性 Bind 到某資料來源的某欄,而 Enable 屬性又 Bind 到 某欄時,那麼當移動資料來源位置的時候,就可以讓 Button 的相關狀態自動改變了。
這讓我想到似乎可以作一些 state machine 的東西...
沒有留言:
張貼留言