我有一个带有图像列的GridView。当我点击每列EditForm打开并编辑我的数据然后按更新按钮,数据存储回GridView。但是当我添加一个图像列并尝试使用EditForm保存图像时,我得到以下错误,阻止单击“更新”按钮。
当我使用InPlace编辑模式时没有问题。就在我使用EditForm时会出现这个问题:
答案 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();
}
}
}