目标:我想查询datagridview上的所有行,并检查同一行上的两列是否等于特定值。我得到一个“对象引用等于null”错误,因为我正在使用foreach循环。执行此任务的最佳方法是什么?显示示例
当前代码:
foreach (DataGridViewRow row in dataTABLE.Rows)
{
if ((row.Cells[0].Value.ToString().ToUpper().Equals(MyServerChecked)) & (row.Cells[1].Value.ToString().ToUpper().Equals(service.ServiceName.ToString().ToUpper())))
}
单击按钮时,值将写入dataTABLE。在该按钮内部,此foreach循环存在,因为我不希望多次创建同一行。这就是我试图查询列值并进行比较的原因
答案 0 :(得分:1)
foreach
与空引用异常无关,除非您在处理它们时删除某些行。您没有提供有关哪个对象收到错误的任何信息,但如果它们为空,则无法调用row.Cells[0].Value
或row.Cells[0].Value
的{{1}}方法。
您可以在if语句中添加其他条件:
ToString()
答案 1 :(得分:1)
为了避免异常,首先检查对象在尝试调用它们之前是否为空。检查......
dataTABLE != null
Cells[0].Value != null
Cells[1].Value != null
话虽如此,你问到了实现这项任务的最佳方法,所以还有其他一些需要考虑的事情。
您可以使用类似dataTable.AsEnumerable().Any( dr => ...);
的内容遍历数据表,以查看是否存在符合条件的任何行。
每当您需要将字符串与其他可能为null的字符串或对象进行比较时,您需要仔细考虑您的要求, 空引用对您来说意味着什么。
如果cell[0].value == null
你还想继续比较MyServerChecked
吗?如果cell[0].value == null
和MyServerChecked == null
那么它们应该被认为是平等的吗?
同样,你想如何处理空字符串?是否应将空字符串视为等于null?
这是一个简单的入门解决方案。如果单元格为空,则不会尝试比较它们。这可能不是您想要的行为,但就像我说的那样,请考虑 空值和空字符串对于您的特定方案和相应代码的意义。< / p>
string MyServerChecked = "Something";
string ServiceName = service.ServiceName.ToString();
if (dataTable != null)
{
foreach (DataGridViewRow row in dataTable.Rows)
{
if (row.Cells[0].Value != null
&& row.Cells[1].Value != null
&& string.Equals(row.Cells[0].Value.ToString(), MyServerChecked, StringComparison.OrdinalIgnoreCase)
&& string.Equals(row.Cells[1].Value.ToString(), ServiceName, StringComparison.OrdinalIgnoreCase))
{
// Row already exists...
}
}
}
使用带有string.Equals
枚举类型的重载StringComparison
方法意味着您不必自己转换为高层。它还为文化设置提供了一些额外的选项。有关详细信息,请查看MSDN上的StringComparison Enumeration。