.Net DataView и привязка DataTable - PullRequest
2 голосов
/ 26 августа 2009

У меня есть простое приложение Windows Forms, которое связывает DataView с ListBox. Этот DataView использует Linq для сортировки моей DataTable по убыванию определенного столбца. Мой ListBox затем привязывается к DataView. Затем у меня есть простая форма для добавления данных в DataTable. Когда я добавляю DataRow в DataTable, он отображается в ListBox.

Мне любопытно, что происходит за кулисами ... Я прочитал :

Объект DataView - это настраиваемое представление одной таблицы данных, которая может быть фильтруется или сортируется. Представление данных является «снимок» данных, используемый комплексным связыванием управления. Вы можете просто или комплексное связывание с данными внутри данных просматривать, но знать, что вы привязка к фиксированной «картинке» данные, а не чистые, обновление источник данных.

Я бы подумал, что, поскольку DataView является «снимком», он не будет автоматически обновляться. Добавляет ли DataView событие для обновления при изменении базового DataTable? Не поймите меня неправильно, я хочу, чтобы это работало, но всегда ли это так?

1 Ответ

2 голосов
/ 25 ноября 2009

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
        }
    }
}

Добавляет ли DataView событие для обновления при изменении базового DataTable?

Это внутренняя деталь реализации, но вполне вероятно, что она использует события.

Обратите внимание, что вы можете использовать метод DataTable.Copy для копирования DataTable, если вы действительно хотите создать снимок DataTable.

...