Это происходит потому, что если вы используете byte[]
тип для представления данных изображений. Сам GridControl может корректно работать с байтами напрямую и правильно преобразовывать Bitmap в изображения-байты и обратно. Вот почему нет проблем в режиме редактирования Inplace.
При работе в режиме EditForm стандартная привязка WinForms используется для передачи изображений изображений в редактор EditForm и обратно. И стандартная привязка не может преобразовать битмап, который вы загрузили в PictureEdit, обратно в массив image-bytes. Вот почему вы видите ошибку проверки.
Чтобы преодолеть эту проблему, вы должны либо типов остерегайтесь преобразованиями с помощью использования точного 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();
}
}
}
очень ясно. Благодарю. но я использую структуру сущности для заполнения grid-view. Должен ли я изменить мой тип изображения в байтах в базе данных сейчас? или я должен просто отредактировать мою структуру Entity Framework, например, класс Person? есть ли более простой способ? –
изображения хранятся в байтах в БД? –
Для вас существует третье возможное решение: вы можете написать свойство wrapper (я предлагаю использовать подход с частичным классом), который не сопоставляется с полем DB и использовать это свойство для привязки. Внутри этой оболочки вы можете выполнить преобразование. – DmitryG