.Net DataView和DataTable绑定

.Net DataView和DataTable绑定,.net,data-binding,datatable,dataview,.net,Data Binding,Datatable,Dataview,我有一个简单的Windows窗体应用程序,它将数据视图绑定到列表框。此DataView使用Linq按特定列降序对我的DataTable进行排序。然后将我的列表框绑定到DataView。然后,我有一个简单的表单向DataTable添加数据。当我向DataTable添加DataRow时,它会显示在列表框中 我很好奇幕后到底发生了什么…: DataView对象是一个自定义视图 单个数据表的 过滤或分类。数据视图是 复杂绑定使用的数据“快照” 控制。你可以是简单的,也可以是简单的 复杂绑定到数据集中的数

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

我很好奇幕后到底发生了什么…:

DataView对象是一个自定义视图 单个数据表的 过滤或分类。数据视图是 复杂绑定使用的数据“快照” 控制。你可以是简单的,也可以是简单的 复杂绑定到数据集中的数据 查看,但请注意您是 绑定到一个固定的“图片”的 数据,而不是一个干净的、更新的 数据源


我本以为既然DataView是一个“快照”,它就不会自动更新。DataView是否在修改基础DataTable时添加要更新的事件?不要误解我的意思,我希望它是这样工作的,但总是这样吗?

数据视图不是快照。当基础
DataTable
发生更改时,它会立即自动更新。添加到
数据表
中的符合
数据视图
过滤条件的新行将自动显示在
数据视图
中。类似地,从
数据表中删除的行将自动从
数据视图中消失

以下说明了即使在使用LINQ时,
DataView
的动态特性:

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
        }
    }
}
使用系统;
使用System.Linq;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
dt.列。添加(“名字”);
var query=来自dt.AsEnumerable()中的行
其中row.Field(“FirstName”).StartsWith(“S”)
选择行;
DataView=query.AsDataView();
Console.WriteLine(view.Count);//打印0
dt.行添加(“Sam”);
dt.行。添加(“约翰”);
Console.WriteLine(view.Count);//打印1
dt.行。添加(“萨利”);
dt.行。添加(“玛丽”);
Console.WriteLine(view.Count);//打印2
dt.Rows.RemoveAt(0);
Console.WriteLine(view.Count);//打印1
}
}
}
DataView是否在修改基础DataTable时添加要更新的事件

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

请注意,如果确实要创建
数据表
的快照,可以使用
数据表.Copy
方法复制
数据表