关于c#:DataView.Count不同的DataView.Table.Rows.Count

DataView.Count different DataView.Table.Rows.Count

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

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

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

谢谢你的帮助。

程式码片段:C#

...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//get the data as DataTable
members = GetMemberDataTable ();

//create views from a new DataTable with no rows
dvValidMembers = new DataView (CreateMembersDT("ValidMembers"));
dvInValidMembers = new DataView (CreateMembersDT("InvalidMembers"));

//iterate thru each row and put into appropriate DataView
foreach (DataRow memberRow in members.Rows)
            {
                if ((bool)memberRow["isValid"])
                    //Add to valid members Dview
                    member = dvValidMembers.AddNew();
                else
                    //add to InValid members Dview
                    member = dvInvalidMembers.AddNew();

                member["memberID"] = memberRow["memID"];

            } //foreach

    dvInvalidMembers.Table.AcceptChanges();
    dvValidMembers.Table.AcceptChanges();

 }

 private System.Data.DataTable CreateMembersDT ( string tableName)
    {
        System.Data.DataTable dtMembers = new System.Data.DataTable(tableName);

        dtMembers.Columns.Add(new DataColumn("memID", typeof(int)));

        return dtMembers;
    }


那第一行排序不正确,那可能是最后一行吗?

我认为您缺少DataView.EndEdit():

1
2
3
4
5
6
7
8
9
10
11
12
13
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个带过滤器的视图,然后只需要将它们指向原始成员表即可。