C# DataView.Count不同的DataView.Table.Rows.Count

C# DataView.Count不同的DataView.Table.Rows.Count,c#,gridview,sorting,count,dataview,C#,Gridview,Sorting,Count,Dataview,我正在使用C和.NET3.5,并且有一个GridView,我正在代码隐藏页面中以编程方式设置数据源。我在一个DataTable中有数据,然后根据每行的列值isValid boolean,我使用DataRowView.AddNew方法创建一个新行到2个DataView中的1个中-dvValid或dvInvalid。我没有创建要添加到DataView表的新DataTable.NewRow。然后将GridView绑定到适当的dataView 对GridView排序时出现问题。我有一个问题,1行排序不正

我正在使用C和.NET3.5,并且有一个GridView,我正在代码隐藏页面中以编程方式设置数据源。我在一个DataTable中有数据,然后根据每行的列值isValid boolean,我使用DataRowView.AddNew方法创建一个新行到2个DataView中的1个中-dvValid或dvInvalid。我没有创建要添加到DataView表的新DataTable.NewRow。然后将GridView绑定到适当的dataView

对GridView排序时出现问题。我有一个问题,1行排序不正确,所有其他行排序都很好。我调试了我的代码,发现DataView.Count比DataView.Table.Rows.Count多1,即使我正在调用DataView.Table.AcceptChanges方法。这很奇怪,因为dataTable应该有所有提交的行,因此计数应该相同

那么为什么这两个计数不同呢?DataView是DataTable的子集,因此其行数不应等于或少于DataTable。 当我填充DataView时,我应该首先创建DataTables而不是直接创建DataView吗?现在,我直接创建一个没有dDataTableRow的DataRowView,这是正确的方法吗

谢谢你的帮助

代码段:C


那一行排序不正确,那会是最后一行吗

我认为您缺少DataView.EndEdit:

foreach (DataRow memberRow in members.Rows)
{
    DataView dv;
    if (...) 
        //Add to valid members Dview
        dv = dvValidMembers;
    else
        dv = dvInvalidMembers;

    member = dv.Addnew();
    member["memberID"] = memberRow["memID"];
    dv.EndEdit();
}

但我还想指出的是,您可能会在isValid上使用带有筛选器的2个视图,然后您只需要将它们指向原始的members表。

谢谢Henk,这是最后一行。让我试试你的其他建议。答案是调用DataRowView.EndEdit方法,这样它也将添加到DataView.DataTable.Rows集合中,并且两个行计数将匹配。此外,在对行进行排序时,GridView.Sort方法似乎会查看DataView.DataTable.Rows集合。但是,我猜在显示GridView时,它使用DataView.DataViewRows集合来显示行。这就是为什么在排序时,它将所有行减去最后一行进行排序,而在显示时,它将显示所有行的原因。是的,可能是这样。请注意,您可以对视图进行排序和筛选。
foreach (DataRow memberRow in members.Rows)
{
    DataView dv;
    if (...) 
        //Add to valid members Dview
        dv = dvValidMembers;
    else
        dv = dvInvalidMembers;

    member = dv.Addnew();
    member["memberID"] = memberRow["memID"];
    dv.EndEdit();
}