【问题标题】:query data table for specific values on same row查询数据表以获取同一行上的特定值
【发布时间】:2014-03-28 16:10:16
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net winforms datagridview


    【解决方案1】:

    为避免异常,请先检查您的对象是否为空,然后再尝试对其调用方法。检查...

    dataTABLE != null
    Cells[0].Value != null
    Cells[1].Value != null
    

    话虽如此,您询问了完成任务的最佳方法,所以这里有一些其他的事情需要考虑。

    您可以使用dataTable.AsEnumerable().Any( dr => ...); 之类的方式遍历数据表,以查看是否已经存在任何符合您条件的行。

    当您需要将字符串与其他可能为 null 的字符串或对象进行比较时,您需要仔细考虑您的要求以及 null 引用对您意味着什么。

    如果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...
            }
        }
    }
    

    将重载的string.Equals 方法与StringComparison 枚举类型一起使用意味着您不必自己转换为upper。它还为您提供了一些文化设置的额外选项。查看 MSDN 上的 StringComparison Enumeration 了解更多信息。

    【讨论】:

      【解决方案2】:

      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()))
      

      【讨论】:

      • “在将它们写入表格之前”是什么意思?您已经在遍历 dataTABLE.Rows 集合。如果您需要所有行的某些条件,您可以迭代dataTable.Rows.Where(some lambda condition)。你也可以使用Distinct 扩展方法。您没有提供任何代码来检查行是否重复,只是一个条件。另外 - 调用 service.ServiceName.ToString() 无效 - 为什么每次迭代都要处理字符串?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2021-10-05
      • 2014-02-13
      • 1970-01-01
      • 2022-10-08
      相关资源
      最近更新 更多