或許應該要說跟 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
得到這兩個屬性之後這個函式就變成是一個通用的函式了!
這樣應該有比移到上一筆、再移回來要高檔一點點了吧?
沒有留言:
張貼留言