2011年10月27日 星期四

C# 的 Bookmark 怎麼用?

記得在 Delphi 的時候我們可以對 DataTable 設定書籤,
但是到了 C# 好像就沒有這招可以用了耶?
先說說書籤的用途好了,
簡單的說就是先記錄下來目前這筆 row 的位置,
然後等等可以快速地回到這筆 row 來!
聽起來很簡單吧!
是呀!但是我就是沒找到有 bookmark 的屬性或是函數,
也沒有看到疑似 bookmark 的屬性或是函數咧?
所以決定試一下看看!
然後就寫出了下面的東東:


  1.             DataRow bookmark = CurrentRow;
  2.             grid.BeginUpdate();
  3.             try
  4.             {
  5.                 foreach (DataRow dr in dataTable.Rows)
  6.                 {
  7.                     CurrentRow = dr;
  8.                     DoBringSQL();
  9.                 }
  10.             }
  11.             finally
  12.             {
  13.                 CurrentRow = bookmark;
  14.                 grid.EndUpdate();
  15.             }



首先呢?就是把目前的 row 塞到變數裡面去啦!

(1)DataRow bookmark = CurrentRow;


CurrentRow 可以用 ((DataRowView)BindingSource.Current).row 取得。

(2)grid.BeginUpdate();

設定 gird.BeginUpdate() 的主要用意就是為了不讓 grid 的 cursor 跟著下面的 foreach 移動,
有點類似鎖定住UI的意思,而這樣的效能也會比較好,因為不用花時間來畫畫面了!
在微軟的【ComboBox.BeginUpdate 方法 】說明如下:
在一次加入一個項目至 ComboBox 時維持效能。
這個方法可防止控制項繪製,直到呼叫 EndUpdate 方法為止。
而我這邊的 grid 是【DevExpress.XtraGrid.GridControl】,道理是一樣的。

接下來的 foreach 就處理我要做的事情啦!
最後的 finally 再把 bookmark 塞回 CurrentRow  去,
然後解除 grid 的 UI 鎖定!

(13)CurrentRow = bookmark;
(14)grid.EndUpdate();

至於 bookmark 塞回去 CurrentRow 怎麼處理呢?
簡單的說就是類似下面的處理方式:

int idx = dataTable.Rows.IndexOf(bookmark);
bindingSource.Position = idx;

處理完畢!over!

沒有留言:

張貼留言