c#DataGridView每行添加图像

时间:2016-04-09 09:56:48

标签: c# datagridview datagrid datagridviewimagecolumn

我有一个GUI,它从文件中加载数据,以便填充我的DataGridView数据。我有两个DataGridViews。一个用于团队,一个用于会员。当我点击其他团队时,它会向我显示与该团队相关的成员。

我希望能够为团队添加一个Image in Team Team,例如TeamLogo。我已经添加了列,并使其成为DataGridViewImageColumn。但是当我使用:

添加图像时
        Image image = Image.FromFile(@"C:\Users\Matthew\Desktop\Images\ManU.jpeg");
        Team_Logo.Image = image;

它为所有团队添加相同的图像是否有一种方法可以添加单独的图像,更有可能添加OpenFileDialog以便找到我自己的图像。

我不介意我不能按列进行操作,只要我每次更换团队时都必须有一个PictureBox,就会出现不同的图像。

1 个答案:

答案 0 :(得分:0)

您真正需要做的就是为每一行分别加载每个值。

以下是一个例子:

首先,我创建一个列,添加它并为其命名:

DataGridViewImageColumn imgCol = new DataGridViewImageColumn();
int icIndex = dataGridView1.Columns.Add(imgCol);
dataGridView1.Columns[icIndex].Name = "Image";

现在我设置所有行的值。我使用ImageList,这很好,因为它很快,并将确保获得相同大小的所有图像。

当然,您需要加载正确的图像。您可能希望通过imageList1.Images.Keys集合访问它们。

foreach (DataGridViewRow row in dataGridView1.Rows)
     if (row.Index < imageList1.Images.Count)    // *
        row.Cells["Image"].Value = imageList1.Images[row.Index];

现在每一行都会显示不同的图像。

根据您的SelectionMode,这样的内容将在PictureBox中显示图像:

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    if (dataGridView1.SelectedRows.Count > 0)
        pictureBox1.Image = imageList1.Images[dataGridView1.SelectedRows[0].Index];
}

但您可能希望Image显示PB大于DGV行?为此,您可以使用第二 ImageList使用更大的ImageSize(仅限256x256)或使用Images.Key属性从磁盘加载图像。

更新

请注意,上面的代码使用简单且相当脆弱的关系将图像组合到行中,依赖于它们都是完整的并且顺序相同。

这应该可以用于测试用户界面,但之后你应该把它换成更健壮的东西。

我添加了一个检查(*),但这只会在图像少于行时阻止IndexOutOfRange错误。

一个想法可能是将团队名称与图像名称联系起来。不知道你的命名方案,我无法提供代码..

如果您希望整体可编辑,您需要考虑存储数据的方式和位置。但这些问题超出了原始问题的范围。