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

时间:2014-03-28 16:10:17

标签: c# asp.net winforms datagridview

目标:我想查询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循环存在,因为我不希望多次创建同一行。这就是我试图查询列值并进行比较的原因

2 个答案:

答案 0 :(得分:1)

foreach与空引用异常无关,除非您在处理它们时删除某些行。您没有提供有关哪个对象收到错误的任何信息,但如果它们为空,则无法调用row.Cells[0].Valuerow.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 == nullMyServerChecked == 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