查询数据表中同一行上的特定值
本文关键字:一行 数据表 查询 | 更新日期: 2023-09-27 17:54:27
目标:我想查询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循环存在,因为我不想多次创建同一行。这就是为什么我试图查询列值并比较它们
要避免异常,在尝试调用对象上的方法之前,首先检查您的对象不是null。检查…
dataTABLE != null
Cells[0].Value != null
Cells[1].Value != null
话虽如此,你问的是完成任务的最佳方法,所以这里有一些其他的事情要考虑。
您可以使用dataTable.AsEnumerable().Any( dr => ...);
之类的东西遍历数据表,看看是否已经存在符合您的标准的行。
当您需要将字符串与其他可能为空的字符串或对象进行比较时,您需要仔细考虑您的需求和空引用对您意味着什么。
如果cell[0].value == null
,你还想继续比较MyServerChecked
吗?如果cell[0].value == null
和MyServerChecked == null
是相等的?
同样,如何处理空字符串?一个空字符串应该被认为等于null吗?
这里有一个简单的解决方案。如果单元格为空,则不会尝试比较它们。这可能不是你想要的行为,但是就像我说的,考虑一下空值和空字符串对你的特定场景意味着什么,并相应地为它编写代码。
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...
}
}
}
使用StringComparison
枚举类型的重载string.Equals
方法意味着您不必自己转换为upper类型。它还为区域性设置提供了一些额外的选项。有关更多信息,请查看MSDN上的StringComparison Enumeration。
foreach
与空引用异常无关,除非您在处理它们时删除一些行。您没有提供任何关于您获得错误的对象的信息,但是如果row.Cells[0].Value
或row.Cells[0].Value
的ToString()
方法为空,则无法调用它们。您可以在if语句中添加额外的条件:
if(row.Cells[0].Value!=null && row.Cells[1].Value!=null
&& row.Cells[0].Value.ToString().ToUpper().Equals(MyServerChecked)
& row.Cells[1].Value.ToString().ToUpper().Equals(service.ServiceName.ToString().ToUpper()))