如何使用Text类型更新DataGridView列中的图像

时间:2018-01-04 17:15:15

标签: c# winforms datagridview

我有一个由DataGridView填充的List。我会发送一封电子邮件,如果没问题,我将status = "S"如下:

var query = (from send in SendMsg
             where send.MessageSentId == str
             select send)
    .Update(st => { st.EmailST = EmailSt; st.SMSST = "N"; });

gvSent.DataSource = null;
gvSent.DataSource = SendMsg;

一切正常,只是现在我需要放两个包含Ok或Not Ok状态的图像。使用下面的代码,而不是我的网格显示图像,它显示System.Drawing.Bitmap文本。我怀疑这是因为列的类型为Text而不是Image。但是这个DataGridView是动态的,我无法定义列的类型。

private void gvSent_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (gvSent.Columns[e.ColumnIndex].Name == "EmailST")
    {
        if (gvSent.Rows[e.RowIndex].Cells[6].Value == "S")
        {
            e.Value = (System.Drawing.Image)Properties.Resources.IMAGE8;
        }
        else
        {
            e.Value = (System.Drawing.Image)Properties.Resources.IMAGE9;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果您说DataGridView是动态的,则表示其列是从数据绑定构造的。因此,在绑定DataGridView之前,请更改该列的数据绑定中的类型,并将其数据替换为图像。在这种情况下,您可以使用另一个类或仅使用匿名类:

var sent = SendMsg.Select(s => new {
    Id = s.Id,
    Name = s.Name,
    EmailST = (s.EmailST == "S"? (System.Drawing.Image)Properties.Resources.IMAGE8
                               : (System.Drawing.Image)Properties.Resources.IMAGE9)
}).ToList();

gvSent.DataSource = null;
gvSent.DataSource = sent;

字段IdName只是示例,因为我不知道您的SendMsg类有哪些字段。我们的想法是,您可以基于SendMsg类构建匿名类,并在修改其他字段时传输一些字段。

或者,您可以在网格中定义列(因此它不再是动态的)。