0
我有一個帶圖像列的GridView。當我點擊每一列EditForm打開,我編輯我的數據,然後按更新按鈕和數據存儲回GridView。但是當我添加圖像列並嘗試使用EditForm保存圖像時,出現以下錯誤,無法單擊「更新」按鈕。devExpress GridView EditForm不允許更新圖像字段
當我使用InPlace編輯模式時沒有問題。只是當我使用EditForm發生此問題:
我有一個帶圖像列的GridView。當我點擊每一列EditForm打開,我編輯我的數據,然後按更新按鈕和數據存儲回GridView。但是當我添加圖像列並嘗試使用EditForm保存圖像時,出現以下錯誤,無法單擊「更新」按鈕。devExpress GridView EditForm不允許更新圖像字段
當我使用InPlace編輯模式時沒有問題。只是當我使用EditForm發生此問題:
這是因爲,如果你使用的是byte[]
類型來表示圖像數據。 GridControl本身可以直接正確操作字節,並正確地將位圖轉換爲圖像字節並返回。這就是爲什麼Inplace編輯模式沒有問題。
在EditForm模式下工作時,使用標準的WinForms綁定將圖像數據傳遞到EditForm的編輯器並返回。標準綁定無法將您加載到PictureEdit的位圖轉換回圖像字節數組。這就是您看到驗證錯誤的原因。
爲了克服這個問題,就應該把避免類型通過使用精確Image
類型來表示圖像數據或修補標準結合如下轉換:
public class Person {
public byte[] Photo { get; set; }
}
//...
gridView1.OptionsBehavior.EditingMode = DevExpress.XtraGrid.Views.Grid.GridEditingMode.EditForm;
gridView1.EditFormPrepared += gridView1_EditFormPrepared;
gridControl1.DataSource = new List<Person> {
new Person()
};
//...
void gridView1_EditFormPrepared(object sender, DevExpress.XtraGrid.Views.Grid.EditFormPreparedEventArgs e) {
var binding = e.BindableControls["Photo"].DataBindings["EditValue"];
binding.Parse += binding_ParseImageIntoByteArray;
}
void binding_ParseImageIntoByteArray(object sender, ConvertEventArgs e) {
Image img = e.Value as Image;
if(img != null && e.DesiredType == typeof(byte[])) {
using(var ms = new System.IO.MemoryStream()) {
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
// get bytes
e.Value = ms.GetBuffer();
}
}
}
很清楚。謝謝。但我使用實體框架來填充網格視圖。我現在應該在數據庫中將我的列類型的圖像更改爲字節嗎?或者我應該只是編輯我的實體框架說Person類?有沒有更簡單的方法? –
圖像以字節的形式存儲在數據庫中? –
還有第三種可能的解決方案:您可以編寫一個包裝屬性(我建議使用部分類方法),該屬性未映射到DB字段並使用此屬性進行綁定。在這個包裝器中,您可以執行轉換。 – DmitryG