2

我有一个简单的 Windows 窗体应用程序,它将 DataView 绑定到 ListBox。此 DataView 使用 Linq 按特定列降序对我的 DataTable 进行排序。我的 ListBox 然后绑定到 DataView。然后我有一个简单的表单来向 DataTable 添加数据。当我将 DataRow 添加到 DataTable 时,它​​会显示在 ListBox 中。

我很好奇幕后发生了什么……我读过

DataView 对象是可以过滤或排序的单个数据表的自定义视图。数据视图是复杂绑定控件使用的数据“快照”。您可以简单或复杂地绑定到数据视图中的数据,但请注意,您绑定的是数据的固定“图片”,而不是干净、更新的数据源。

我会认为由于 DataView 是“快照”,它不会自动更新。修改基础 DataTable 时,DataView 是否添加要更新的事件?不要误会我的意思,这就是我希望它工作的方式,但总是这样吗?

4

1 回答 1

2

DataView不是快照。它会随着基础的DataTable变化而自动并立即更新。添加到 的DataTable符合DataView过滤条件的新行将自动出现在 中DataView。同样,从 中删除的DataTable行将自动从 中消失DataView

下面说明了DataView使用 LINQ 时偶数的动态性质:

using System;
using System.Linq;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("FirstName");

            var query = from row in dt.AsEnumerable()
                        where row.Field<string>("FirstName").StartsWith("S")
                        select row;

            DataView view = query.AsDataView();

            Console.WriteLine(view.Count); // Prints 0
            dt.Rows.Add("Sam");
            dt.Rows.Add("John");
            Console.WriteLine(view.Count); // Prints 1
            dt.Rows.Add("Sally");
            dt.Rows.Add("Mary");
            Console.WriteLine(view.Count); // Prints 2
            dt.Rows.RemoveAt(0);
            Console.WriteLine(view.Count); // Prints 1
        }
    }
}

修改基础 DataTable 时,DataView 是否添加要更新的事件?

这是一个内部实现细节,但它使用事件是合理的。

请注意,如果您确实要创建 的快照,可以使用DataTable.Copy复制 的方法。DataTableDataTable

于 2009-11-24T23:51:19.367 回答