查询数据表中同一行上的特定值

本文关键字:一行 数据表 查询 | 更新日期: 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 == nullMyServerChecked == 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].Valuerow.Cells[0].ValueToString()方法为空,则无法调用它们。您可以在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()))