我的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();
也无济于事。
答案 0 :(得分:1)
order of events有时会迫使您延迟一些事情,直到显示Form
及其布局完全完成。
因此,将呼叫转移到Form.Shown
或Form.Layout
事件通常会有所帮助。请注意,Form.Layout
可能会more often发生this,因此Form.Shown
可能是首选,除非你想使用旗帜。
在this和CSS Tricks帖子中,围绕这个主题进行了有趣的讨论。