【问题标题】:.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。