.Net DataView and DataTable Binding

倖福魔咒の 提交于 2019-12-11 02:29:26

问题


I have a simple Windows Forms application which binds a DataView to a ListBox. This DataView uses Linq to sort my DataTable by a specific column descending. My ListBox is then bound to the DataView. I then have a simple form to add data to the DataTable. When I add a DataRow to the DataTable it displays in the ListBox.

I'm curious as to whats going on behind the scenes... I've read:

A DataView object is a customized view of a single data table that may be filtered or sorted. A data view is the data "snapshot" used by complex-bound controls. You can simple- or complex-bind to the data within a data view, but be aware that you are binding to a fixed "picture" of the data rather than a clean, updating data source.

I would have thought that since the DataView is a "snapshot" it wouldn't have automatically updated. Does a DataView add an event to update when the underlying DataTable is modified? Don't get me wrong, this is how I want it to work, but is this always the case?


回答1:


The DataView is not a snapshot. It is updated automatically and immediately as the underlying DataTable changes. New rows added to the DataTable that meet the DataView's filter criteria will automatically appear in the DataView. Similarly, rows removed from the DataTable will automatically disappear from the DataView.

The following illustrates the dynamic nature of the DataView even when using 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
        }
    }
}

Does a DataView add an event to update when the underlying DataTable is modified?

This is an internal implementation detail, but it is plausible that this uses events.

Note that you can use the DataTable.Copy method to copy a DataTable, if you really want to create a snapshot of the DataTable.



来源:https://stackoverflow.com/questions/1334877/net-dataview-and-datatable-binding

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!