.Net DataView和DataTable绑定

时间:2009-08-26 13:57:22

标签: .net data-binding datatable dataview

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

我很好奇在幕后发生什么...... I've read

  

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

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

1 个答案:

答案 0 :(得分: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的快照,则可以使用DataTable方法复制DataTable