2016-06-29 16 views
0

Ich habe ein GridView mit Bildspalte. Wenn ich auf jede Spalte klicke, öffnet sich EditForm und ich bearbeite meine Daten und drücke dann die Schaltfläche Update und die Daten werden wieder in GridView gespeichert. Wenn ich jedoch eine Bildspalte hinzufüge und versuche, ein Bild mit EditForm zu speichern, erhalte ich den folgenden Fehler, der das Klicken auf die Schaltfläche Aktualisieren verhindert.devExpress GridView EditForm erlaubt keine Bildfelder zu aktualisieren

Wenn ich InPlace Bearbeitungsmodus verwenden, gibt es kein Problem. nur wenn ich EditForm dieses Problem verwenden auftritt:

My Error

Antwort

1

Dies geschieht, weil, wenn Sie den byte[] Typen verwenden Ihre Bilddaten darzustellen. Das GridControl selbst kann korrekt mit Bytes arbeiten und Bitmap direkt in Image-Bytes und zurück konvertieren. Deshalb gibt es im Inplace-Bearbeitungsmodus kein Problem.

Wenn Sie im EditForm-Modus arbeiten, wird die Standard-WinForms-Bindung verwendet, um Bilddaten in den EditForm-Editor und zurück zu übertragen. Und die Standardbindung kann das Bitmap, das Sie in das PictureEdit geladen haben, nicht in das image-bytes-Array konvertieren. Deshalb sehen Sie den Validierungsfehler.

Um dieses Problem zu überwinden, sollten Sie entweder vermeiden Typen Umwandlung den genauen Image Typs über Verwendung von Bilddaten zu repräsentieren oder die Bindung Standard-Patch wie folgt:

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

sehr klar. Vielen Dank. aber ich verwende Entity-Framework, um die Grid-Ansicht zu füllen. Soll ich jetzt meinen Spaltentyp von Bild zu Byte in der Datenbank ändern? oder sollte ich gerade meine Entity Framework-Klasse "Person" bearbeiten? Gibt es einen einfacheren Weg? –

+0

Bilder werden als Byte im DB gespeichert? –

+0

Es gibt eine dritte mögliche Lösung für Sie: Sie können eine Wrapper-Eigenschaft schreiben (ich schlage vor, die partielle Klasse Ansatz zu verwenden), die nicht DB-Feld zugeordnet ist und diese Eigenschaft für die Bindung verwenden. Innerhalb dieses Wrappers können Sie die Konvertierung durchführen. – DmitryG