Задать вопрос

Как обновить DataGrid.ItemsSource без фризов (C# WPF .NET 4.5)?

Приветствую всех, увы попытки найти 'велосипеды' в гугле закончились безрезультатно.
Проблема такова:

У меня есть
public static DataTable DataTableAccounts { get; set; }
Который я получаю с БД

Чтоб впервые отобразить его в своем DataGrid я делаю так:
DataGridAccounts.ItemsSource = DataTableAccounts.DefaultView;


Потом я начинаю проводить 'некие манипуляции' с DataTableAccounts
и чтоб отобразить измененную версию, я использую костыль:
DataGridAccounts.ItemsSource = null;
DataGridAccounts.ItemsSource = DataTableAccounts.DefaultView;


Все работает отлично, НО обновляю довольно часто, примерно раза 2 в сек. а DataTableAccounts большой (1000 рядов)
Поэтому у меня все во фризах.

Вопрос такой:
Как асинхронно (либо с помощью других триксов) обновлять DataGrid без фризов?

P.S. Я пытался и через Binding в разметке, но тогда ничего не обновляется=)
  • Вопрос задан
  • 3610 просмотров
Подписаться 4 Оценить 4 комментария
Пригласить эксперта
Ответы на вопрос 1
@vais
Все работает отлично, НО обновляю довольно часто, примерно раза 2 в сек. а DataTableAccounts большой (1000 рядов)

Ну тысяча рядов же видна не сразу?
Подгружайте сначала ту часть, что видна пользователю, а при прокручивании догружайте еще записей
(гуглим- постепенное отображение данных в datagrid)
Биндинг в WPF (выдернул из проекта, думаю разберетесь)

<DataGrid x:Name="dg_last_run_params" CanUserAddRows="False" HorizontalScrollBarVisibility="Disabled" AutoGenerateColumns="False" IsReadOnly="True" SelectionMode="Extended"ItemsSource="{Binding}" Margin="5,3,0,0" FontSize="11" BorderBrush="{x:Null}" Grid.Column="1" Grid.Row="1" MouseLeave="dg_last_run_params_MouseLeave" SelectionChanged="dg_last_run_params_SelectionChanged">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Param Name" MinWidth="140" Width="*" Binding="{Binding param_name}" ClipboardContentBinding="{x:Null}" FontSize="10"/>
                            <DataGridTextColumn  Header="Param Value"  MinWidth="170" Width="*" Binding="{Binding param_value}" ClipboardContentBinding="{x:Null}"/>
                        </DataGrid.Columns>

часть в C# коде
array_workflow_run_param.Clear();
array_workflow_run_param = session.Get_Workflow_Run_Params();
 dg_last_run_params.ItemsSource = array_workflow_run_param;
 dg_last_run_params.Items.Refresh();


internal class WorkflowParametersValue
    {
        public string param_name { get; set; }
        public string param_value { get; set; }
        public string param_man_value { get; set; }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы