2015-02-08 110 views
3

我有一个看似简单的问题,我已经动态地创建了一个DataTable,并向它添加行就好了。不过,我有一个列将有一个标志,这是一个图像。我已经将两个标志(.png图像)导入到项目资源中。但是我无法将DataType设置为System.Type.Bitmap,因为DataColumn不支持,因为可以在这里看到。我看到了一个解决方案,说我设定数据类型如下用于将图像保存在DataTable的DataColumn中的DataType

dataColumn = new DataColumn("Flag"); 
dataColumn.DataType = System.Type.GetType("System.Byte[]"); //Replacing System.Byte[] with System.Type.Bitmap throws Type Exception 
dataTable.Columns.Add(dataColumn); 

然而抛出异常,说明编译器预计字节]但得到的位图。

这是我如何添加到数据表

row["Part Number"] = part; 
row["Module Name"] = populator.LookUpAValue(moduleSql); 
row["Flag"] = Properties.Resources.Yellow_Flag; 
row["Location"] = populator.LookUpAValue(nameSql); 
dataTable.Rows.Add(row); 

行这里是我的问题,其数据类型我保存图像列,所以当我展示给一个DataGridView我看到显示的图像。如果没有在DataGridView的,而不是被显示的图像设置数据类型,我得到的文本 System.Drawing.Bitmap

回答

2

这是为我工作的代码。

DataTable dt = new DataTable(); 
DataColumn dc = new DataColumn("Column1"); 
dc.DataType = System.Type.GetType("System.Byte[]"); 
dt.Columns.Add(dc); 
DataRow row = dt.NewRow(); 
var imageConverter = new ImageConverter(); 
row["Column1"] = imageConverter.ConvertTo(Properties.Resources._1, System.Type.GetType("System.Byte[]")); 
dt.Rows.Add(row); 
this.dataGridView1.DataSource = dt; 
6

您可以使用BitmapByte[]DataType

DataGridView显示如果您有相关的DataColumnDataGridViewTextColumn代替DataGridViewImageColumn类型名称。添加DataGridViewImageColumn并将DataTable中的图像列与此创建的列相关联。

如果你想设置的DataTypeByte[],存储图像时,您必须将图像隐蔽到Byte[]并同时从DataTable隐蔽从Byte[]读取图像。

dataColumn.DataType = System.Type.GetType("System.Byte[]"); 

图像到Byte[]转换

Image image = dataGridView1.Rows[rowIndex].Cells[columnIndex].Value as Image; 
if(image != null) 
{ 
    MemoryStream ms = new MemoryStream(); 
    image.Save(ms, System.Drawing.Imaging.ImageFormat.); 
    byte[] imagedata = ms.ToArray(); 
} 

Byte[]图像转换

MemoryStream ms = new MemoryStream(imagedata); 
Image img = Image.FromStream(ms); 
dataGridView1.Rows[rowIndex].Cells[columnIndex].Value = img;