2016-06-29 4 views
0

У меня есть GridView со столбцом изображения. когда я нажимаю на каждый столбец EditForm, и я редактирую свои данные, а затем нажмите кнопку «Обновить», и данные сохраняются обратно в GridView. но когда я добавляю столбец изображения и пытаюсь сохранить изображение с помощью EditForm, я получаю следующее сообщение об ошибке, которое не позволяет нажать кнопку «Обновить».devExpress GridView EditForm не позволяет обновлять поля изображений

Когда я использую режим редактирования InPlace, проблем нет. только когда я использую EditForm этот вопрос возникает:

My Error

ответ

1

Это происходит потому, что если вы используете 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(); 
     } 
    } 
} 
+0

очень ясно. Благодарю. но я использую структуру сущности для заполнения grid-view. Должен ли я изменить мой тип изображения в байтах в базе данных сейчас? или я должен просто отредактировать мою структуру Entity Framework, например, класс Person? есть ли более простой способ? –

+0

изображения хранятся в байтах в БД? –

+0

Для вас существует третье возможное решение: вы можете написать свойство wrapper (я предлагаю использовать подход с частичным классом), который не сопоставляется с полем DB и использовать это свойство для привязки. Внутри этой оболочки вы можете выполнить преобразование. – DmitryG

 Смежные вопросы

  • Нет связанных вопросов^_^