devExpress GridView EditForm不允许更新图像字段

时间:2016-06-29 07:38:44

标签: c# gridview devexpress devexpress-windows-ui

我有一个带有图像列的GridView。当我点击每列EditForm打开并编辑我的数据然后按更新按钮,数据存储回GridView。但是当我添加一个图像列并尝试使用EditForm保存图像时,我得到以下错误,阻止单击“更新”按钮。

当我使用InPlace编辑模式时没有问题。就在我使用EditForm时会出现这个问题:

My Error

1 个答案:

答案 0 :(得分:1)

这是因为如果您使用byte[]类型来表示图像数据。 GridControl本身可以直接使用字节正确操作,并正确地将Bitmap转换为图像字节并返回。这就是Inplace编辑模式没有问题的原因。

在EditForm模式下工作时,标准的WinForms绑定用于将图像数据传递到EditForm的编辑器中并返回。标准绑定无法将您加载到PictureEdit中的Bitmap转换回图像字节数组。这就是您看到验证错误的原因。

要解决此问题,您应该避免类型转换,方法是使用精确的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();
        }
    }
}