星期五, 4月 28, 2006

[.Net]資料繫結與巡覽

資料的繫結基本上都是靠 Controls.DataBindings,所以
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 的東西...

沒有留言: