2009-09-30 59 views
2

我有一个DataGridView,它有一个类作为它的DataSource。C#DataGridView单行的颜色文本

该类包含一个ID字符串,两个DateTimes和一个布尔值。

我已经写了一些代码来改变一个匹配ID的行的文本我传递给方法红色,但没有任何我已经尝试的作品。

这是我到目前为止有:

public void ShowInstanceAsTerminated(String id) 
{ 
    foreach (DataGridViewRow dgvRow in dgvRIM.Rows) 
    { 
     if (dgvRow.Cells[0].Value.ToString() == id) 
     { 
      dgvRow.DefaultCellStyle.ForeColor = Color.Red; 
     } 
    } 
} 

这是我已经尝试了很多代码的变化之一,但有问题的细胞永远不会改变!

感谢 尼尔

回答

10

试试这个格式。

+0

+1 - 这是我试图解决的同一个概念,但你说得更好。 – David 2009-09-30 16:36:17

+0

这不适合我。 在调试会话期间,我可以看到应用于单元格的样式,但它实际上从未发生变化。下次它仍然没有设置。 我想知道是否必须在更改后将该行设置为该行。例如: dgvRIM.Row [myrow] = newRow; 嗯......任何想法,而我给它一去? – neildeadman 2009-09-30 16:48:02

+0

如何在改变颜色以强制datagridview更新后添加一行代码?下面的代码应该这样做: dvgRIM.Invalidate(); – David 2009-09-30 16:49:49

0

您需要更改单个细胞。

这是从一个应用程序中解除了VB代码,我可以成功地做到这一点,但它不应该很难将其转换为C#。如果你想设置的整个行,遍历所有的细胞

dgvRIM.Rows[myRow].Cells[0].Style.ForeColor = Color.Red; 

For i As Integer = 0 To ds.Tables("AddressChanges").Rows.Count - 1 
       If ds.Tables("AddressChanges").Rows(i)("iSeriesAddress").ToString <> ds.Tables("AddressChanges").Rows(i)("CSIAddress").ToString() Then 
        Me.dgAddressDiscrepancies.Rows(i).Cells("iSeriesAddress").Style.BackColor = Color.Yellow 
        Me.dgAddressDiscrepancies.Rows(i).Cells("CSIAddress").Style.BackColor = Color.Yellow 
       End If 
Next 
+0

他想要更改行的ForeColor,这可以不必修改每个单元格的ForeColor/BackColor。 – 2009-09-30 16:30:35

+0

理论上你应该是对的,但在实践中,我发现它不起作用。除非有什么改变,那是..我的代码是.Net 2.0,所以可能DataGridView已经更新,但正如他在他的问题中所说的,如果你尝试将它应用到一行,它不会引发错误,但会不改变颜色。无论如何,我的答案是改变背景颜色,而不是前景色,但概念是相同的。 @Eric J以相同的想法回答,但形式更好,更清晰。 – David 2009-09-30 16:35:44

+0

@David Stratton:我刚刚测试过它,它确实有效(请参阅我的答案)。出于什么原因,它不适用于你的情况?为什么要设置单个细胞的ForeColor更好? – 2009-09-30 18:04:29

5

使用DataGridView的CellFormatting事件对组成行的单个单元格进行更改。

像这样的东西(注意,未测试):

private void dgvRIM_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { 
    if (dgvRIM.Rows[e.RowIndex].Cells[0].Value.ToString() == id) { 
    e.CellStyle.ForeColor = Color.Red; 
    } 
} 
+0

+1。您可以使用e.Value。 – Vivek 2009-09-30 16:56:40

+0

+1。 Vivek,他不能使用e.Value,他想检查行的第一个单元格的值,它不一定是当前单元格的值。 – 2009-09-30 18:07:14

+0

这可以工作,并设置该行的所有单元格的样式,而不循环遍历每个单元格 – 2013-10-17 21:39:32

0

我只是测试你的代码(设定ForeColorDefaultCellStyle)和它的工作(使用.NET 3.5,但我不认为的WinForms自2.0开始发展)。

现在我不知道为什么它不适合你...也许你在添加行之前调用代码,或者在代码被调用后重新加载行?无论哪种方式,你可能更适合Jay Riggs的解决方案,因为即使你之后添加了新的行,它也可以工作。

0

我相信解决方案在于当你设置颜色,而不是你的方法。已经提出了几个不同的事件,其中一些事实上会起作用使用cellformatting,databindingcomplete甚至绘画事件的问题之一是它们被多次触发。从我所收集的内容来看,datagridview控件存在一个问题,因为在显示窗体后,您无法更改任何单元格的颜色。因此,运行的方法或调用Shown()之前触发的事件不会更改颜色。作为问题解决方案的事件通常有效,但由于它们被多次调用,可能不是最有效的答案。

问题的最简单的解决办法可能是将您的代码填充到您的表单的Shown()方法中,而不是构造函数中。下面是msdn论坛中发布的一篇文章的链接,它将我引入解决方案,它被标记为答案约3/4。

MSDN forums post with the Solution

1

这将正常工作

private void grid1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    DataGridViewRow row = grid1.Rows[e.RowIndex];// get you required index 
    // check the cell value under your specific column and then you can toggle your colors 
    row.DefaultCellStyle.BackColor = Color.Green; 
} 
0

似乎有与TabControl当有多个选项卡,则与代码创建cellstyles只适用于一个bug 第一个选项卡的DataGridView,因此要解决此问题,您可以将您的DataGridView移动到第一个选项卡,或者您可以使用TabControl的SelectedIndexChanged事件并将哟你在这个事件中的造型代码。

0
row.DefaultCellStyle.ForeColor = Color.Red; 

这适用于.NET 4.0及更高版本。