在DataGridView中使用DataTable显示小图像(Icon)

时间:2016-08-06 13:09:29

标签: c# winforms datagridview binding datatable

[编辑]

我想使用DataTable在Datagridview上使用图片。

RadioButton只是这篇文章的一个简单问题格式。

让我清楚自己。

如何添加此"图像"或那"图像"在datagridview上使用绑定样式?

(因为,

我想,它比正常方式更快。我制作了500行图像和文本 - 它们都是16 * 16和短文。 如果我重绘它,我花了 20秒。二十!!!!这是胡说八道。我试过" Double buffer"解决方法,但没有比这更好的了。)

我制作了代码。

它只是DataGridView上RadioButton的起点。

到目前为止一切顺利。

我在上面拍了五张照片。

喜欢这个。

enter image description here

        dataGridView1.RowCount = 5;
        dataGridView1.Rows[0].Cells[0].Value = Properties.Resources.WhiteBall;
        dataGridView1.Rows[1].Cells[0].Value = Properties.Resources.BlueBall;
        dataGridView1.Rows[2].Cells[0].Value = Properties.Resources.WhiteBall;
        dataGridView1.Rows[3].Cells[0].Value = Properties.Resources.WhiteBall;
        dataGridView1.Rows[4].Cells[0].Value = Properties.Resources.WhiteBall;

问题。

如何使用" DataTable绑定样式"来生成相同的结果? ?

我只有错误"在行和#34;需要正确的数据类型。

我的第二次尝试的代码是;

        DataTable myTable = new DataTable();
        DataColumn myCoulmn = new DataColumn();
        myCoulmn.DataType = Type.GetType("System.Drawing.Bitmap");
        myTable.Columns.Add(myCoulmn);
        DataRow myRow = myTable.NewRow();
        myRow[0] = Properties.Resources.WhiteBall;
        myRow[1] = Properties.Resources.BlueBall;
        myRow[2] = Properties.Resources.WhiteBall;
        myRow[3] = Properties.Resources.WhiteBall;
        myRow[4] = Properties.Resources.WhiteBall;
        myTable.Rows.Add(myRow);
        dataGridView1.DataSource = myTable;

请帮助。

1 个答案:

答案 0 :(得分:2)

使用DataTable在DataGridView中显示图像

要使用DataTable创建图片列,您应使用DataColumn byte[]数据类型和DataGridViewImageColumn DataGridVide。因此,您首先需要将图像转换为字节数组,然后将它们设置为具有字节数组数据类型的数据列的值:

var imageConverter = new ImageConverter();
var b1 = (byte[])imageConverter.ConvertTo(Properties.Resources.Image1, typeof(byte[]));
var b2 = (byte[])imageConverter.ConvertTo(Properties.Resources.Image2, typeof(byte[]));
var dt = new DataTable();
dt.Columns.Add("Column1", typeof(byte[]));
dt.Rows.Add(b1);
dt.Rows.Add(b2);
this.dataGridView1.DataSource = dt;

如果您想显示图片而不是布尔类型

使用图像类型不适合单选按钮。此类DataColumn的合适数据类型为bool,列的合适DataGridViewColumnDataGridViewCheckBoxColumn。然后,您可以处理CellPainting DataGridView事件并使用RadioButtonRenderer这样绘制一个单选按钮:

private void Form1_Load(object sender, EventArgs e)
{
    var dt = new DataTable();
    dt.Columns.Add("Column1", typeof(bool));
    dt.Rows.Add(false);
    dt.Rows.Add(true);
    this.dataGridView1.DataSource = dt;
    this.dataGridView1.CellPainting += dataGridView1_CellPainting;
}

void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex == 0 && e.RowIndex >= 0)
    {
        var value = (bool?)e.FormattedValue;
        e.Paint(e.CellBounds, DataGridViewPaintParts.All &
                                ~DataGridViewPaintParts.ContentForeground);
        var state = value.HasValue && value.Value ?
            RadioButtonState.CheckedNormal : RadioButtonState.UncheckedNormal;
        var size = RadioButtonRenderer.GetGlyphSize(e.Graphics, state);
        var location = new Point((e.CellBounds.Width - size.Width) / 2,
                                    (e.CellBounds.Height - size.Height) / 2);
        location.Offset(e.CellBounds.Location);
        RadioButtonRenderer.DrawRadioButton(e.Graphics, location, state);
        e.Handled = true;
    }
}