【问题标题】:.Net DataView and DataTable Binding.Net DataView 和 DataTable 绑定
【发布时间】:2009-08-26 13:57:21
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: .net data-binding datatable dataview


    【解决方案1】:

    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 的快照,可以使用DataTable.Copy 方法复制DataTable

    【讨论】:

      猜你喜欢
      • 2012-03-16
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 2018-07-16
      • 2016-02-24
      • 1970-01-01
      • 2014-03-07
      相关资源
      最近更新 更多