即使在Windows窗体中,我也希望根据加载时的特定条件更改DGV行的背景颜色。但我看不到任何DGV行的颜色变化。谁能告诉我怎样才能解决这个问题呢?
private void frmSecondaryPumps_Load(object sender, EventArgs e)
{
try
{
DataTable dt = DeviceData.BindData("SECONDARY_PUMPS".ToUpper());
dataGridView1.DataSource = dt;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
foreach (DataGridViewColumn column in dataGridView1.Columns)
{
if (row.Cells[column.Name] != null)
{
if (row.Cells[column.Name].Value.ToString() == "ON")
row.DefaultCellStyle.BackColor = System.Drawing.Color.Green;
if (row.Cells[column.Name].Value.ToString() == "OFF")
row.DefaultCellStyle.BackColor = System.Drawing.Color.Red;
}
}
}
dataGridView1.Refresh();
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
答案 0 :(得分:12)
我认为最好的方法是在CellFormatting
的{{1}}事件中设置BackColor,这些就是这些。
DataGridView
答案 1 :(得分:12)
使用cellformatting
,databindingcomplete
或甚至paint
事件的一个问题是它们被多次触发。根据我收集的内容,datagridview
控件存在一个问题,即在显示表单之前,您无法更改任何单元格的颜色。因此,在Shown()
被调用之前运行的方法或事件将不会改变颜色。作为问题解决方案的事件通常有效,但由于它们被多次调用,可能不是最有效的答案。
问题的最简单的解决方案可能就是使用代码在表单的Shown()
方法而不是构造函数中填充/着色网格。以下是msdn论坛中一篇帖子的链接,该帖子向我提供了解决方案,它被标记为关于页面下方3/4的答案。
答案 2 :(得分:3)
King_Rob是正确的。我遇到了同样的问题所以我将发布我的实现,因为这里的其他建议远非最佳。
添加事件处理程序(在设计器或构造函数中):
this.Load += UserControl_Load; // or form or any control that is parent of the datagridview
dataGridView1.VisibleChanged += DataGridView1_VisibleChanged;
在load event hander方法中添加一个标志
private bool _firstLoaded;
private void UserControl_Load(object sender, EventArgs e)
{
_firstLoaded = true;
}
最后在可见事件处理程序方法中:
private void DataGridView1_VisibleChanged(object sender, EventArgs e)
{
if (_firstLoaded && dataGridView1.Visible)
{
_firstLoaded = false;
// your code
}
}
答案 3 :(得分:1)
很抱歉迟到的答案,但我现在只是面对完全相同的问题。
对于在构造函数中无法正常工作的内容,我有一些通用的解决方案 - 使用计时器
将其设置为短时间,如100毫秒。然后在构造函数中你将有
timer1.Enabled=true
并在timer_Tick事件中:
timer1.Enabled=false
and all the code that doesn't work in constructor goes here...
每次都对我有用。
答案 4 :(得分:0)
主要问题是在运行此代码时。您使用触发器_Load
运行它,这就是为什么它没有着色的原因,当您在表单上使用触发器_Shown
运行相同的代码时,着色将起作用。加载表单时会触发加载,因此在代码之后仍会运行一些幕后代码。所显示的触发器在完成所有操作并完全加载表单后运行。
答案 5 :(得分:-1)
此代码快速,简单且不占用内存!
例如,在CellEndEdit事件
中使用此代码 `try{
//your code
}
catch(Exception){
//your exception
}
finally{
yourDataGridView.Visible = false;
yourDataGridView.Visible = true;
}
`
答案 6 :(得分:-1)
使用以下代码更改Datagrid项目的颜色
Datagrid1.SelectedIndex = e.Item.ItemIndex;
Datagrid1.Items[e.Item.ItemIndex].Cells[0].BackColor = System.Drawing.Color.Green;