2012年4月30日 星期一

強迫寫入XtraGrid.RepositoryItem 的值到 DataRow 去

前幾天跟 XtraGrid 奮戰了好久,
或許應該要說跟 RepositoryItem 奮戰吧!
主要的原因是因為要讓 User 直接在 Grid 上面修改 Detail 的資料,
但是如果 User 修改完資料直接按下存檔,
Detail 上面最後一筆的修改並不會存入 DataTable;
原本我們在其他的 XtraEditor 的時候會去抓 DataBinding ,
然後強迫他寫入,如下:

Binding b = XtraEditors.DataBindings[0];
if (!(b == null)) b.WriteValue();

爸特~~~

非常可惜的是 RepositoryItem 並沒有這個屬性!
然後總共試了下面幾項方式,通通失敗!
  • 對 GridControl 的 DataBinding 下 WriteValue() 沒用!
  • 直接找到那個 DataRow 下 EndEdit() 也沒用!
  • 然後孤狗到傳說中的 GridView.PostEditor() 也沒有用!
  • 對 GridView.ActiveEditor 下 WriteValue() 也不行,因為 ActiveEditor 會對應到 RepositoryItem ,然後 DataBinding.Count 是 0 ,所以沒有 DataBinding 可以下 WriteValue() !
  • 然後用 RepositoryItem.OwnerEdit 也不行,因為 OwnerEdit 是 null。
最後本來想要放棄了!
直接用很 low 的方法,直接移到別筆再移回來的說!
但是被笑了~~~只好像想想別的方式!

最後想說乾脆在 RepositoryItem.EditValueChanged 的時候把變更的值寫進去好了,
沒想到......這也不是那麼容易的事情。
不過經過前面的失敗,也學到了一些屬性,
總之最後程式如下:

第一,在 Form 建立的時候先把 RepositoryItem 的事件掛起來,如下:

repCheck.EditValueChanged += new EventHandler(RepositoryEdit_EditValueChanged);
repText1.EditValueChanged += new EventHandler(RepositoryEdit_EditValueChanged);
repText2.EditValueChanged += new EventHandler(RepositoryEdit_EditValueChanged);

第二, RepositoryEdit_EditValueChanged 程式如下:

void RepositoryEdit_EditValueChanged(object sender, EventArgs e)
{
    DataRow current = ((DataRowView)BindingSource.Current).Row;

    current[GridView.FocusedColumn.FieldName] = GridView.ActiveEditor.EditValue;
    current.EndEdit();
}

簡單的說就是找到目前的那一個 DataRow ,
然後強迫把 RepositoryItem 的值寫到 DataRow 去。
重點有兩個,I 找到目前修改的欄位名稱:

GridView.FocusedColumn.FieldName

II 抓到修改後的值:

GridView.ActiveEditor.EditValue

得到這兩個屬性之後這個函式就變成是一個通用的函式了!

這樣應該有比移到上一筆、再移回來要高檔一點點了吧?

沒有留言:

張貼留言