我有一个简单的 Windows 窗体应用程序,它将 DataView 绑定到 ListBox。此 DataView 使用 Linq 按特定列降序对我的 DataTable 进行排序。然后我的列表框绑定到数据视图。然后我有一个简单的表单来将数据添加到数据表中。当我将 DataRow 添加到 DataTable 时,它会显示在列表框中。
我很好奇幕后发生了什么......我读了 http://msdn.microsoft.com/en-us/library/aa983707%28VS.71%29.aspx:
DataView 对象是自定义视图
单个数据表的数据可能是
过滤或排序。数据视图是
复杂绑定使用的数据“快照”
控制。您可以简单地-或
复杂绑定到数据内的数据
查看,但请注意,您是
绑定到固定的“图片”
数据而不是干净的、更新的
数据源。
我本以为,由于 DataView 是一个“快照”,它不会自动更新。当底层 DataTable 修改时,DataView 是否添加更新事件?不要误会我的意思,这就是我想要的工作方式,但情况总是如此吗?
The 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
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)