2016-06-29 47 views
0

我有一個帶圖像列的GridView。當我點擊每一列EditForm打開,我編輯我的數據,然後按更新按鈕和數據存儲回GridView。但是當我添加圖像列並嘗試使用EditForm保存圖像時,出現以下錯誤,無法單擊「更新」按鈕。devExpress GridView EditForm不允許更新圖像字段

當我使用InPlace編輯模式時沒有問題。只是當我使用EditForm發生此問題:

My Error

回答

1

這是因爲,如果你使用的是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(); 
     } 
    } 
} 
+0

很清楚。謝謝。但我使用實體框架來填充網格視圖。我現在應該在數據庫中將我的列類型的圖像更改爲字節嗎?或者我應該只是編輯我的實體框架說Person類?有沒有更簡單的方法? –

+0

圖像以字節的形式存儲在數據庫中? –

+0

還有第三種可能的解決方案:您可以編寫一個包裝屬性(我建議使用部分類方法),該屬性未映射到DB字段並使用此屬性進行綁定。在這個包裝器中,您可以執行轉換。 – DmitryG