无法更改datagridview winforms中的图像

use*_*084 2 c# datagridview image winforms

如果存在另一列中指定的路径,我需要更改列的图像.

我有以下代码:

dataGridView1.DataSource = table;


        DataGridViewButtonColumn buttonCol = new DataGridViewButtonColumn();
        buttonCol.HeaderText = "";
        buttonCol.Name = "BrowseButton";
        buttonCol.Text = "...";
        buttonCol.UseColumnTextForButtonValue = true; 
        dataGridView1.Columns.Add(buttonCol);

        DataGridViewImageColumn imgCol = new DataGridViewImageColumn();
        imgCol.HeaderText = "Status";
        imgCol.Name = "StatusImage";
        imgCol.Image = null;
        dataGridView1.Columns.Add(imgCol);
        dataGridView1.Columns["StatusImage"].DisplayIndex = 4;

 foreach (DataGridViewRow myRow in dataGridView1.Rows)
        {
            string overRiddenDirPath = myRow.Cells["Overridden Dir"].Value.ToString();
            string preConfiguredPath = myRow.Cells["PreConfigured Dir"].Value.ToString();
            string path = overRiddenDirPath;
            if (overRiddenDirPath == "")
            {
                path = preConfiguredPath;
            }

            DataGridViewImageCell cell = myRow.Cells["StatusImage"] as DataGridViewImageCell;

            // If the directory doesn't exist
            if (!Directory.Exists(path))
            {
                cell.Value = Image.FromFile(@"Chrysanthemum.jpg");
            }
            else
            {
                cell.Value = Image.FromFile(@"Jellyfish.jpg");                   
            }
        }
Run Code Online (Sandbox Code Playgroud)

没有显示图像:图像的路径很好,因为如果我这样说:

  DataGridViewImageColumn imgCol = new DataGridViewImageColumn();
        imgCol.HeaderText = "Status";
        imgCol.Name = "StatusImage";
        imgCol.Image = Image.FromFile(@"Chrysanthemum.jpg");
        dataGridView1.Columns.Add(imgCol);
        dataGridView1.Columns["StatusImage"].DisplayIndex = 4;
Run Code Online (Sandbox Code Playgroud)

它会显示但不会因条件而改变.

此外,是否有更好的方法将图像添加到datagridview单元格.

任何帮助表示赞赏.谢谢

Dav*_*all 6

您可以将代码放入CellFormatting事件中.

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{            
    if (dataGridView1.Columns[e.ColumnIndex].Name == "StatusImage")
    {
        // Your code would go here - below is just the code I used to test
        e.Value = Image.FromFile(@"C:\Pictures\TestImage.jpg");
    }
}
Run Code Online (Sandbox Code Playgroud)

需要注意的一件重要事情是你在这里设置e.Value而不是cell.Value.


以下是我尝试的示例中的代码,其中我访问另一列的值以有条件地更改所选图像.无论图像具有哪种显示索引,这都可以完美地工作.

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (!dataGridView1.Rows[e.RowIndex].IsNewRow)
    {
        if (dataGridView1.Columns[e.ColumnIndex].Name == "StatusImage")
        {
            if (((int)dataGridView1.Rows[e.RowIndex].Cells["ValueTwo"].Value) == 5)
            {
                e.Value = Image.FromFile(@"C:\Pictures\TestImage1.jpg");
            }
            else
            {
                e.Value = Image.FromFile(@"C:\Pictures\TestImage2.jpg");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在示例中,我有一个包含整数值的列,但它应该以类似的方式用于文本.