C# 检查DataView中是否至少有一行包含空值的有效方法?

C# 检查DataView中是否至少有一行包含空值的有效方法?,c#,ado.net,C#,Ado.net,我需要在DataView中进行测试,以检查是否至少有一行包含一个空值单元格。你认为最好的方法是什么 提前感谢。如果不进行测量,我猜答案是嵌套循环。如果不进行测量,我猜答案是嵌套循环。正如SLaks提到的,您需要在行和每行中的项目上循环。您可以使用LINQ这样做: bool hasNull = view.Table.Rows.OfType<DataRow>() .Any(r => r.ItemArray.Any(o => o == DBNull.Value));

我需要在DataView中进行测试,以检查是否至少有一行包含一个空值单元格。你认为最好的方法是什么


提前感谢。

如果不进行测量,我猜答案是嵌套循环。

如果不进行测量,我猜答案是嵌套循环。

正如SLaks提到的,您需要在行和每行中的项目上循环。您可以使用LINQ这样做:

bool hasNull = view.Table.Rows.OfType<DataRow>()
    .Any(r => r.ItemArray.Any(o => o == DBNull.Value));
虽然LINQ版本要紧凑得多,但它仍然会在行和列之间循环,所以请选择

更新: 根据您的评论,这里有一个更好的示例,它基于您正在尝试的操作。这只是在行上循环,并检查给定列是否为null(确保将
DBNull.Value
DataTable
一起使用),如果是,只需将其设置为false,以防止出现问题。只需将
更改为默认值\u COL
即可作为正确的索引

const int IS_DEFAULT_COL = 1;
foreach (DataRow row in view.Table.Rows)
{
    if (row[IS_DEFAULT_COL] == DBNull.Value)
        row[IS_DEFAULT_COL] = false;
}

正如SLaks所提到的,您需要在行和每行中的项目之间循环。您可以使用LINQ这样做:

bool hasNull = view.Table.Rows.OfType<DataRow>()
    .Any(r => r.ItemArray.Any(o => o == DBNull.Value));
虽然LINQ版本要紧凑得多,但它仍然会在行和列之间循环,所以请选择

更新: 根据您的评论,这里有一个更好的示例,它基于您正在尝试的操作。这只是在行上循环,并检查给定列是否为null(确保将
DBNull.Value
DataTable
一起使用),如果是,只需将其设置为false,以防止出现问题。只需将
更改为默认值\u COL
即可作为正确的索引

const int IS_DEFAULT_COL = 1;
foreach (DataRow row in view.Table.Rows)
{
    if (row[IS_DEFAULT_COL] == DBNull.Value)
        row[IS_DEFAULT_COL] = false;
}


最好的方法是在数据库中执行检查…并让它做它擅长的事情。@Mitch:我们不知道DataView来自何处。基本上,我有一些复选框绑定到这个DataView,我有一个“isDefault”列(布尔值)来说明是否必须检查每个复选框的isDefault值。我的问题是,如果数据视图中的值为Null,我想自动将复选框值设置为false,因为如果它试图将Null绑定到复选框,则会出现错误。因此,我的想法是测试数据视图,如果测试返回true,则不尝试绑定复选框。但在绑定过程中,可能有更好的解决方案process@SLaks:是的。但我发现大部分来自数据库。最好的方法是在数据库中执行检查…并让它做它擅长的事情。@Mitch:我们不知道DataView来自何处。基本上,我有一些复选框绑定到这个DataView,我有一个“isDefault”列(布尔值)说明是否必须检查每个复选框的isDefault值。我的问题是,如果数据视图中的值为Null,我想自动将复选框值设置为false,因为如果它试图将Null绑定到复选框,则会出现错误。因此,我的想法是测试数据视图,如果测试返回true,则不尝试绑定复选框。但在绑定过程中,可能有更好的解决方案process@SLaks:是的。但我发现大部分数据都来自数据库。比如:foreach(数据视图中的数据行dr){if dr[“Column”]==Null…}然后循环遍历每一列。比如:foreach(数据视图中的数据行dr){if dr[“Column”]==Null…}然后循环遍历每一列。非常感谢wsanville!我在考虑这个常规循环,但您的LinQ解决方案似乎更有趣、更紧凑:)您能告诉我您对初始问题的看法吗?我在上面的最后一个评论中已经解释过了?因为也许我可以直接在绑定过程中解决这个问题,而不是尝试测试dataview。谢谢,我记得我在我的绑定材料中尝试了一些东西,比如“如果为null,则绑定为false”,当您执行checkbox.databindings.add(……)时,有一个选项,我想,但这似乎不起作用,我仍然有一个错误。不要调用
ItemArray
;它不需要分配数组。您好,我的linq版本有一个问题,因为我的dataview上有一个筛选器,我只想循环经过筛选的行,所以我知道如何更改常规代码来实现这一点,如:foreach(DataRowView drv in View)。。。而不是(view.Table.Rows中的DataRow row),但我找不到如何将linq版本更改为仅循环经过筛选的行。谢谢!非常感谢维桑维尔!我在考虑这个常规循环,但您的LinQ解决方案似乎更有趣、更紧凑:)您能告诉我您对初始问题的看法吗?我在上面的最后一个评论中已经解释过了?因为也许我可以直接在绑定过程中解决这个问题,而不是尝试测试dataview。谢谢,我记得我在我的绑定材料中尝试了一些东西,比如“如果为null,则绑定为false”,当您执行checkbox.databindings.add(……)时,有一个选项,我想,但这似乎不起作用,我仍然有一个错误。不要调用
ItemArray
;它不需要分配数组。您好,我的linq版本有一个问题,因为我的dataview上有一个筛选器,我只想循环经过筛选的行,所以我知道如何更改常规代码来实现这一点,如:foreach(DataRowView drv in View)。。。而不是(view.Table.Rows中的DataRow row),但我找不到如何将linq版本更改为仅循环经过筛选的行。谢谢!