我有一个简单的Windows窗体应用程序,它将DataView绑定到ListBox。此DataView使用Linq按特定列降序对DataTable进行排序。然后我的ListBox绑定到DataView。然后我有一个简单的表单来向DataTable添加数据。当我向DataTable添加DataRow时,它会显示在ListBox中。
我很好奇在幕后发生什么...... I've read:
DataView对象是自定义视图 可能是单个数据表的 过滤或排序。数据视图是 复杂绑定使用的数据“快照” 控制。你可以简单或 复杂绑定到数据中的数据 观点,但请注意你是 绑定到固定的“图片” 数据而不是干净,更新 数据来源。
我原以为由于DataView是一个“快照”,它不会自动更新。在修改基础DataTable时,DataView是否添加要更新的事件?不要误解我的意思,这就是我希望它工作的方式,但总是这样吗?
答案 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
。