Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#DataGridView单行彩色文本_C#_Datagridview_Coding Style - Fatal编程技术网

C#DataGridView单行彩色文本

C#DataGridView单行彩色文本,c#,datagridview,coding-style,C#,Datagridview,Coding Style,我有一个DataGridView,它有一个类作为它的数据源 该类包含一个ID字符串、2个日期时间和一个布尔值 我已经编写了一些代码,将与我传递给方法的ID相匹配的行的文本更改为红色,但我尝试过的任何操作都不起作用 这就是我到目前为止所做的: public void ShowInstanceAsTerminated(String id) { foreach (DataGridViewRow dgvRow in dgvRIM.Rows) { if (dgvRow.Ce

我有一个DataGridView,它有一个类作为它的数据源

该类包含一个ID字符串、2个日期时间和一个布尔值

我已经编写了一些代码,将与我传递给方法的ID相匹配的行的文本更改为红色,但我尝试过的任何操作都不起作用

这就是我到目前为止所做的:

public void ShowInstanceAsTerminated(String id)
{
    foreach (DataGridViewRow dgvRow in dgvRIM.Rows)
    {
        if (dgvRow.Cells[0].Value.ToString() == id)
        {
            dgvRow.DefaultCellStyle.ForeColor = Color.Red;
        }
    }
}
这是我尝试过的许多代码变体中的一个,但所涉及的单元格从未更改

谢谢
Neil

您需要更改单个单元格

这是从一个应用程序中提取的VB代码,在这个应用程序中,我能够成功地完成这项工作,但将其转换为c#应该不难

对于i As Integer=0到ds.Tables(“AddressChanges”).Rows.Count-1
如果ds.Tables(“AddressChanges”).Rows(i)(“iSeries地址”).ToString ds.Tables(“AddressChanges”).Rows(i)(“CSIAddress”).ToString()则
Me.dgAddressDifferences.Rows(i).Cells(“iSeries地址”).Style.BackColor=Color.Yellow
Me.dgAddressDifferences.Rows(i).Cells(“CSIAddress”).Style.BackColor=Color.Yellow
如果结束
下一个
试试这种格式:

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

如果要设置整行,请在所有单元格上循环。

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

类似这样的情况(注意,未经测试):

我刚刚测试了您的代码(使用
DefaultCellStyle
设置
ForeColor
),它确实可以工作(使用.NET3.5,但我认为Winforms自2.0以来没有发展)

现在我不知道为什么它不适合你。。。可能在添加行之前调用代码,或者在调用代码之后重新加载行


不管是哪种方式,使用Jay Riggs的解决方案可能会更好,因为即使之后添加新行,它也会起作用。

我相信解决方案在于设置颜色的时间,而不是设置颜色的方法。已经提出了几个不同的活动,其中一些确实会起作用。使用cellformatting、databindingcomplete甚至paint事件的问题之一是它们会被多次触发。据我所知,datagridview控件存在一个问题,在显示表单之前,您无法更改任何单元格的颜色。因此,在调用Showed()之前运行的方法或触发的事件不会更改颜色。定位为问题解决方案的事件通常是有效的,但由于它们被多次调用,可能不是最有效的答案

解决这个问题最简单的方法可能是将填充/着色网格的代码放在表单的show()方法中,而不是放在构造函数中。下面是msdn论坛上的一篇帖子的链接,该帖子向我提供了解决方案的线索,它标记为页面下方3/4处的答案

这很好用

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;
}

TabControl
似乎存在一个bug,当它有多个选项卡时,
用代码创建的单元格样式只应用于第一个选项卡的DataGridView,因此,要解决此问题,您可以将
DataGridView
移动到第一个选项卡,或者使用TabControl的
SelectedIndexChanged
事件,将样式代码放入此事件中

row.DefaultCellStyle.ForeColor = Color.Red;

这至少适用于.NET 4.0及以上版本。

他希望更改行的前景色,这可以在不修改每个单元格的前景色/背景色的情况下完成。理论上你应该是对的,但在实践中,我发现它不起作用。除非有什么改变,那就是。。我的代码是.NET2.0,因此DataGridView可能已经更新,但正如他在问题中所说的,如果您尝试将其应用于一行,它不会抛出错误,但也不会更改颜色。无论如何,我的答案是改变背景色,而不是前景色,但概念是一样的@Eric J用同样的想法回答,但形式更好、更清晰。@David Stratton:我刚刚测试过,它确实有效(见我的答案)。你的案子为什么不起作用?为什么设置单个单元格的前景色效果更好???+1-这是我试图理解的同一个概念,但你的措辞更好。这对我不起作用。在调试会话期间,我可以看到应用于单元格的样式,但它实际上从未更改。下一次还没定下来。我想知道我是否必须将该行设置为更改后的行。类似于:dgvRIM.Row[myrow]=newRow;嗯。。。。我试一试有什么想法吗?在更改颜色后添加一行代码以强制更新datagridview怎么样?下面的代码应该这样做:dvgRIM.Invalidate();我的另一个想法引发了一个例外。dvgRIM.Invalidate();我也不行。我真的不知道我做错了什么。。真奇怪!我添加了一个改变了的手机样式,但它还没有被点击@乔纳曼:我不认为简单地设置房产会非常昂贵。物理上不可见的行在实际可见之前不应产生重新排序成本。在尝试优化问题之前,我会测试您对“多行”定义的性能。+1。Vivek,他不能使用e.Value,他想检查行的第一个单元格的值,该单元格不一定是当前单元格。这是可行的,可以设置行中所有单元格的样式,而不必遍历每个单元格
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;
}
row.DefaultCellStyle.ForeColor = Color.Red;