1

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

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

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

谢谢你的帮助。

代码片段:C#

...

//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;
    }
4

1 回答 1

0

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

我认为您缺少 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();
}

但我还想指出,您可能可以使用 2 个带有过滤器的视图,isValid然后您只需要将它们指向原始成员表。

于 2009-10-19T22:18:30.427 回答