DataGridViewImageCell图像未显示在“加载”上,但显示在“刷新”上

时间:2015-08-17 09:00:47

标签: c# datagridview refresh

我的ImageColumn上有DataGridView根据另一个名为" HasWarnings"的隐藏单元格行事。在表单Load事件上,我刷新此DataGridView,因此对于每一行,如果HasWarning为true,则显示警告图像和其他成功图像。我的DataGridView

上还有一个刷新按钮

然而,图像不会显示在Form Load事件上,我会得到红十字图像。只有当我按下“刷新”按钮时,他们才会回来。让我感到惊讶的是,通过单击 Refresh 按钮,可以调用与Load事件相同的功能。下面是在Load事件和按钮单击时调用的Refresh方法的代码:

public void RefreshHistory()
{
    pnlOverview.Visible = false;
    pnlNoHistory.Visible = false;
    try
    {
       using (var db = new Entities(cs)
       {
         var linqHistory = db.Histories.Select(h => new 
            { h.Id, h.RunDate, h.HasWarnings }).OrderByDescending(h => h.RunDate).Take(500);
          if (linqHistory.Any())
          {
                dgvHistory.DataSource = linqHistory.ToList();
                dgvHistory.Columns["Id"].Visible = false;
                dgvHistory.Columns["HasWarnings"].Visible = false;
                dgvHistory.Columns["RunDate"].HeaderText = "Date/Time";
                pnlOverview.Visible = true;
                dgvHistory.Rows[0].Selected = true;
                long reportId = Convert.ToInt64(dgvHistory.Rows[0].Cells["Id"].Value);
                SetWarningImages();
                SetReportDetails(reportId);
            }
            else pnlNoHistory.Visible = true;
        }
    }
    catch (Exception ex)
    {
        Log.Error(ex.Message);
    }
}

这是SetWarningImages()方法,可以将相应的图像分配给DataGridView中的每一行:

private void SetWarningImages()
{
    foreach (DataGridViewRow row in dgvHistory.Rows)
    {
        bool hasWarnings = (bool)row.Cells["HasWarnings"].Value;
        if (hasWarnings)
            ((DataGridViewImageCell)row.Cells["HasWarningsImage"]).Value = 
                                              Properties.Resources.warning16;
        else
            ((DataGridViewImageCell)row.Cells["HasWarningsImage"]).Value =
                                               Properties.Resources.success16;
    }
}

我想知道为什么这个代码不能在Load上显示图像(但数据显示正确),但适用于button_click

N.B。添加行dgvHistory.Refresh();dgvHistory.PerformLayout();也无济于事。

1 个答案:

答案 0 :(得分:1)

order of events有时会迫使您延迟一些事情,直到显示Form及其布局完全完成。

因此,将呼叫转移到Form.ShownForm.Layout事件通常会有所帮助。请注意,Form.Layout可能会more often发生this,因此Form.Shown可能是首选,除非你想使用旗帜。

thisCSS Tricks帖子中,围绕这个主题进行了有趣的讨论。