Vb.net DataGridView单元格格式化未格式化所有指定的单元格

Vb.net DataGridView单元格格式化未格式化所有指定的单元格,vb.net,winforms,datagridview,Vb.net,Winforms,Datagridview,我有一个通过DataTable填充DataGridView的SQL查询: SELECT top 100 a.Ordnum, oldBFE, newBFE, oldCBRA, newCBRA, oldLOMC, newLOMC, oldfld, newfld FROM (SELECT Ordnum, PrpBFE as oldBFE, CBRADte as oldCBRA, LOMCDte as oldLOMC, FldZne AS oldfld FROM [TOD].[dbo].[Or

我有一个通过DataTable填充DataGridView的SQL查询:

SELECT top 100 a.Ordnum, oldBFE, newBFE, oldCBRA, newCBRA, oldLOMC, newLOMC, oldfld,    newfld FROM 
(SELECT Ordnum, PrpBFE as oldBFE, CBRADte as oldCBRA, LOMCDte as oldLOMC, FldZne AS oldfld 
FROM [TOD].[dbo].[Orders] with (NOLOCK) WHERE RecRevDesc = '1 - Order Clone') a 
JOIN 
(SELECT Ordnum, PrpBFE as newBFE CBRADte as newCBRA, LOMCDte as newLOMC, FldZne AS newfld 
FROM [TOD].[dbo].[Orders] with (NOLOCK) WHERE RecRevDesc = '2 Determination Completed-Workflow') b 
ON a.Ordnum = b.Ordnum
如果某些单元格对的值不相等,我需要两个单元格都有一个红色的前景色。现在,我通过cellformatting事件触发此命令:

For i As Integer = 0 To Me.gridCompare.RowCount - 1
  If Me.gridCompare.Rows(i).Cells(1).ToString <> Me.gridCompare.Rows(i).Cells(2).ToString Then
    Me.gridCompare.Rows(i).Cells(1).Style.ForeColor = Color.Red
    Me.gridCompare.Rows(i).Cells(2).Style.ForeColor = Color.Red
  ElseIf Me.gridCompare.Rows(i).Cells(3).ToString <> Me.gridCompare.Rows(i).Cells(4).ToString Then
    Me.gridCompare.Rows(i).Cells(3).Style.ForeColor = Color.Red
    Me.gridCompare.Rows(i).Cells(4).Style.ForeColor = Color.Red
  ElseIf Me.gridCompare.Rows(i).Cells(5).ToString <> Me.gridCompare.Rows(i).Cells(6).ToString Then
    Me.gridCompare.Rows(i).Cells(5).Style.ForeColor = Color.Red
    Me.gridCompare.Rows(i).Cells(6).Style.ForeColor = Color.Red
  ElseIf Me.gridCompare.Rows(i).Cells(7).ToString <> Me.gridCompare.Rows(i).Cells(8).ToString Then
    Me.gridCompare.Rows(i).Cells(7).Style.ForeColor = Color.Red
    Me.gridCompare.Rows(i).Cells(8).Style.ForeColor = Color.Red
  End If
Next
对于i As Integer=0到Me.gridCompare.RowCount-1
如果Me.gridCompare.Rows(i).Cells(1).ToString Me.gridCompare.Rows(i).Cells(2).ToString那么
Me.gridCompare.Rows(i).Cells(1).Style.ForeColor=Color.Red
Me.gridCompare.Rows(i).Cells(2).Style.ForeColor=Color.Red
ElseIf Me.gridCompare.Rows(i).Cells(3).ToString Me.gridCompare.Rows(i).Cells(4).ToString然后
Me.gridCompare.Rows(i).Cells(3).Style.ForeColor=Color.Red
Me.gridCompare.Rows(i).Cells(4).Style.ForeColor=Color.Red
ElseIf Me.gridCompare.Rows(i).Cells(5).ToString Me.gridCompare.Rows(i).Cells(6).ToString然后
Me.gridCompare.Rows(i).Cells(5).Style.ForeColor=Color.Red
Me.gridCompare.Rows(i).Cells(6).Style.ForeColor=Color.Red
ElseIf Me.gridCompare.Rows(i).Cells(7).ToString Me.gridCompare.Rows(i).Cells(8).ToString然后
Me.gridCompare.Rows(i).Cells(7).Style.ForeColor=Color.Red
Me.gridCompare.Rows(i).Cells(8).Style.ForeColor=Color.Red
如果结束
下一个

但是,只有单元格1和单元格2具有正确的格式。我做错了什么?列的顺序并不重要。我也尝试了单独的IF语句。

您不能使用ElseIf分支,因为这将阻止测试其他对。将每个测试放在它自己的IF-EndIf中。您还需要测试单元格的Value属性:

If Me.gridCompare.Rows(i).Cells(1).Value.ToString <> _
   Me.gridCompare.Rows(i).Cells(2).Value.ToString Then
  'etc
End If

If Me.gridCompare.Rows(i).Cells(3).Value.ToString <> _
   Me.gridCompare.Rows(i).Cells(4).Value.ToString Then
  'etc
End If
If Me.gridCompare.Rows(i).Cells(1).Value.ToString_
Me.gridCompare.Rows(i).Cells(2).Value.ToString然后
等等
如果结束
如果Me.gridCompare.Rows(i).Cells(3).Value.ToString_
Me.gridCompare.Rows(i).Cells(4).Value.ToString然后
等等
如果结束

另外,请确保这些单元格不为null(或不为空),否则它将引发异常。

当我将if语句更改为:if Me.gridCompare.Rows(I).cells(1).Value.ToString Me.gridCompare.Rows(I).cells(2).Value.ToString Then Me.gridCompare.Rows(I).cells(1).Style.ForeColor=Color.Red Me.gridCompare.Rows(i) .细胞(2).Style.ForeColor=Color.Red如果出现以下错误,则结束:对象引用未设置为对象的实例。另外,前两个单元格的空值不是问题。不管怎样,格式都是正确的,只是后续单元格的格式是正确的@LarsTech。@alybaba726请参见答案中的最后一句。您必须检查空值:
 如果Me.gridCompare.Rows(i).Cells(3).Value不是空的,那么
等。前两个单元格可能有空字符串。不要忘记单元格的索引顺序是0,所以当你说“前两个单元格”时,你实际上指的是网格中的单元格0和1,而不是单元格1和2。是的,第一个单元格(0)不包括在配对中,谢谢你指出了经常被忽略的错误。是的,你对空单元格的看法是完全正确的。我会修复它,我相信它会很好地工作。感谢你看到我做不到的事情!说真的@LarsTech,如果我们足够接近,我可以打败你,谢谢你,少校!知道了之后我现在觉得很傻出了什么问题。@alybaba726很有意思的提议。我将接受一次追加投票。:-)