Просмотр сериализованного класса изображения в качестве поля данных изображения (DataSet в качестве источника данных для DataGridView) - PullRequest
1 голос
/ 18 сентября 2011

Сначала спасибо, что прочитали мою проблему.

Фон

Я работаю над DataGridView, который использует существующий файл XML в качестве источника данных:

public DataSet TableDatabase = new DataSet();
TableDatabase.ReadXml("xml_file.xml");
(DataGridView)DbTable.DataSource = TableDatabase.Tables[0];

Базовый файл XMLобщая база данных с id, int, text.

Что я хочу сделать

Что я в основном хочу сделать, это добавить новый столбец с typeof Bitmap (источник из буфера обмена) и сериализуйте его как Base64 "string".

Если я использую первую строку "typeof (Bitmap)", данные изображения будут показаны как image, но не знаю, как его сериализовать ...

// DataColumn col = TableDatabase.Tables[0].Columns.Add("columnname", typeof(Bitmap));
DataColumn col = TableDatabase.Tables[0].Columns.Add("columnname", typeof(MyImage));

Я создал класс под названием «MyImage» (на основе Сериализация растрового изображения в C # /. NET в XML ):

[Serializable]
public class MyImage : IXmlSerializable
{
    public Bitmap Image { get; set; }
    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }
    public void ReadXml(System.Xml.XmlReader reader)
    {
        reader.ReadStartElement();
        MemoryStream ms = null;
        byte[] buffer = new byte[256];
        int bytesRead;
        while ((bytesRead = reader.ReadContentAsBase64(buffer, 0, buffer.Length)) > 0)
        {
            if (ms == null)
            {
                ms = new MemoryStream(bytesRead);
            }
            ms.Write(buffer, 0, bytesRead);
        }
        if (ms != null)
        {
            Image = (Bitmap)System.Drawing.Image.FromStream(ms,true,true);
        }
        reader.ReadEndElement();  
    }
    public void WriteXml(System.Xml.XmlWriter writer)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            Image.Save(ms, ImageFormat.Bmp);
            byte[] bitmapData = ms.ToArray();
            writer.WriteBase64(bitmapData, 0, bitmapData.Length);
        }
    }
}

Работает действительно хорошо, яможно загрузить и записать изображения в формате xml:

<columnname>...base64 data...</columnname>

Проблема

Поле данных в DataGridView не будет отображаться как изображение: (*

Это просто показывает строку: " Пространство имен.MyImage". Так как я могу сказать DataCell показать изображение?

1 Ответ

0 голосов
/ 18 сентября 2011

Проблема в том, что

 msdata:DataType="NAMESPACE.MyImage, APPNAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" 

приведен к классу MyImage, тогда как

 msdata:DataType="System.Drawing.Bitmap, APPNAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" 

предоставит способ увидеть изображение.Поэтому мне нужно знать, как определить, что цель MyImage является растровым изображением ... :(

Решено:

Я был действительно тупой;)

    [XmlIgnoreAttribute()]
    public Bitmap Picture = new Bitmap(1, 1);

    // Serializes the 'Picture' Bitmap to XML.
    [XmlElementAttribute("Picture")]
    public byte[] PictureByteArray
    {
        get
        {
            TypeConverter BitmapConverter = TypeDescriptor.GetConverter(Picture.GetType());
            return (byte[])BitmapConverter.ConvertTo(Picture, typeof(byte[]));
        }

        set
        {
            Picture = new Bitmap(new MemoryStream(value));
        }
    }

И Клетка:

DataColumn col = TableDatabase.Tables[0].Columns.Add("columnname", PictureByteArray.GetType());
...