none
Как улучшить прокрутку WPF DataGrid, который содержит большое количество записей? RRS feed

  • Вопрос

  • Парни, вы меня извините (если можете, конечно), что я сегожня долблю по пустякам - самому неловко. Но я ещё раз извиняюсь. Ситуация у меня следующая. У меня в программе есть WPF DataGrid, который привязан к ADO.NET DataTable. В DataTable с большой частотой (в среднем с интервалом 100) миллисекунд добавляются записи. Соответственно количество их там - большое. Поэтому DataGrid, который к нему привязан, тоже здорово нагружен. Привязку я делаю следующим образом:

    Определил в приложении класс ReplicationDataProvider:

    public class ReplicationDataProvider
    {
            /// <summary>
            /// Предоставляет данные из журнала заявок клиента.
            /// </summary>
            /// <returns>Представление таблицы "Журнал заявок" по умолчанию</returns>
            public DataView GetMyOrdersLog()
            {
                return MainWindow.ordersLogTable.DefaultView;
            }
    }

    Затем в XAML пишу:

    <Window x:Class="Balalaika.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:Balalaika"
            Title="MainWindow" Height="350" Width="715"
            WindowState="Maximized">
        <Window.Resources>
              <ObjectDataProvider x:Key="ReplicationDataProvider" 
                        ObjectType="{x:Type local:ReplicationDataProvider}"/>
              <ObjectDataProvider x:Key="OrdersLog" ObjectInstance="{StaticResource ResourceKey=ReplicationDataProvider}" MethodName="GetMyOrdersLog"/>
        </Window.Resources>

    И в определении WPF DataGrid там же в XAML пишу:

    <DataGrid Name="dgOrdersLog" Grid.Column="0" Margin="10" AutoGenerateColumns="False"
              IsReadOnly="True" CanUserAddRows="False" CanUserDeleteRows="False"
              CanUserResizeRows="False" CanUserReorderColumns="False"
              ItemsSource="{Binding Source={StaticResource ResourceKey=OrdersLog}}">

    и затем там же привязываю колонки датагрида:

    <DataGrid.Columns>
             <DataGridTextColumn Header="№ Заявки" Binding="{Binding Path=id_ord}"/>
             <DataGridTextColumn Header="Цена сделки" Binding="{Binding Path=deal_price}"/>
             <DataGridTextColumn Header="Инструмент" Binding="{Binding Path=isin_id}"/>
    </DataGrid.Columns>

    конечно на самом деле их больше.

    В общем - Datagrid нагружен здорово. Объём данных в нем очень большой. Скроллинг от этого - плохой.

    Вопрос первый. Если я вместо DataTable буду использовать List<T>, содержащий объекты с структурой эквивалентной структуре строки (Row) дататейбла, то просматривать (скроллировать) датагрид будет легче или нет? (DataTable  у меня не взаимодействует с БД, а используется автономно).

    Вопрос второй. Если привязать датагрид к LINQ, выполняемый к Datatable или к List<T> и при переходе на тот вкладыш TabControl'а, на котором находится датагрид, выполнять этот линк, то это займет много времени, исходя из того, что в DataTable (или в List<T>) много записей?

    Голова кругом, извиняюсь идёт уже.


    • Изменено TownSparrow 13 сентября 2012 г. 12:09
    13 сентября 2012 г. 12:09

Ответы

  • К сожалению нет даже если вы замените DataTable на List ничего не поменяется будет так же тормозить при скролинге

    по второму вопросу да так же будет выполнятся много времени
    • Помечено в качестве ответа TownSparrow 14 сентября 2012 г. 6:12
    13 сентября 2012 г. 12:36

Все ответы

  • К сожалению нет даже если вы замените DataTable на List ничего не поменяется будет так же тормозить при скролинге

    по второму вопросу да так же будет выполнятся много времени
    • Помечено в качестве ответа TownSparrow 14 сентября 2012 г. 6:12
    13 сентября 2012 г. 12:36
  • Наверное мне лучше большие объёмы данных писать в файл, а потом порциями брать их от туда для просмотра?
    13 сентября 2012 г. 12:59
  • Да только смотрите что бы файл не разросся до неимоверных размеров, да и с вашей скоростью добовления могут начаться проблемы паралельного доступа, лучше чистите вашу таблицу раз в какое то время и оставляйте в ней только необходимые
    13 сентября 2012 г. 13:01
  • Про регулярную очистку DataTable я думал. Но мне было бы хорошо иметь в своём распоряжении как бы "исторические данные" за день или за полдня. Хотя бы что за полдня. Т.е. журнал заявок за одну торговую сессию на фондовой бирже. А торговая сессия длиться порядка 6 часов. Пользуясь случаем хочу спросить - чтение и запись выполняются быстрее всего в двоичный файл? Например, с помощью BinaryWriter и BinaryReader? Если записывать как числовые, так и строковые данные и ещё даты (DateTime).


    • Изменено TownSparrow 13 сентября 2012 г. 13:57
    13 сентября 2012 г. 13:47
  • В DataGrid включен режим виртуализации (тогда будут в память загружены только те данные, что отображаются)? Сам грид не в StackPanel?

    Плюс если у вас много данных, то нужно их тоже виртуализировать (т.е. загружать в грид порциями, а не все сразу). Об этом есть статья WPF: Data Virtualization


    Для связи [mail]

    17 сентября 2012 г. 6:31