Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 2
Регистрация: 13.03.2021
Сообщений: 34

Асинхронный показ DataGrid.RowDetailsTemplate

10.10.2023, 09:54. Показов 403. Ответов 13
Метки c#, wpf, xaml (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть DataGrid, в RowDetailsTemplate которого лежит другой DataGrid:

XML Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<DataGrid x:Name="dgFile" Margin="10" AutoGenerateColumns="False" IsReadOnly="True">
                    <DataGrid.Columns>
                        <DataGridTextColumn Binding="{Binding SheetName}" Header="Лист" MinWidth="200"/>
                        <DataGridTextColumn Binding="{Binding CountRows}" Header="Кол-во записей" MinWidth="200"/>
                    </DataGrid.Columns>
                    <DataGrid.RowDetailsTemplate>
                        <DataTemplate>
                            <DataGrid ItemsSource="{Binding RowsModels}" AutoGenerateColumns="False" IsReadOnly="True">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Binding="{Binding Number}" Header="№ п/п"/>
                                    <DataGridTextColumn Binding="{Binding Address}" Header="Адрес"/>
                                    <DataGridTextColumn Binding="{Binding HouseNumber}" Header="Дом"/>
                                    <DataGridTextColumn Binding="{Binding Fias}" Header="Уникальный номер адресообразующего элемента в государственном адресном реестре"/>
                                </DataGrid.Columns>
                            </DataGrid>
                        </DataTemplate>
                    </DataGrid.RowDetailsTemplate>
                </DataGrid>
Модели реализованы следующим способом:

C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public class SheetModel
    {
        public string SheetName { get; set; } = "";
        public int CountRows { get; set; }
        public List<RowsModel> RowsModels { get; set; } = new List<RowsModel>();
    }
 
    public class RowsModel
    {
        public int Number { get; set; }
        public string Address { get; set; } = "";
        public string HouseNumber { get; set; } = "";
        public Guid Fias { get; set; }
    }
Собственно, RowsModel и лежит в RowDetailsTemplate. В RowsModel часто лежит много строк (иногда больше 10 000), из-за чего происходит подвисание программы на существенное время. Вопрос, как устранить это? Возможно ли пустить асинхронно?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.10.2023, 09:54
Ответы с готовыми решениями:

Привязка данных к DataGrid внутри DataGrid.RowDetailsTemplate
Это может показаться запутанным,но постарайтесь понять. У меня есть List в котором хранятся объекты в которых тоже есть...

DataGrid внутри DataGrid.RowDetailsTemplate
У меня есть модель, внутри которой есть другая модель в List. Я бы хотел разместить ее в DataGrid.RowDetailsTemplate, чтобы при раскрытии...

dataGrid binding связанные таблицы RowDetailsTemplate
Приветствую! Помогите, пожалуйста, выйти из тупика: Есть 2 таблицы, логически связанный по GUID: 1. guid | field11 | field12 | ... |...

13
Модератор
Эксперт .NET
 Аватар для Элд Хасп
15966 / 11100 / 2866
Регистрация: 21.04.2018
Сообщений: 32,628
Записей в блоге: 2
10.10.2023, 10:14
Цитата Сообщение от Denpol Посмотреть сообщение
Вопрос, как устранить это? Возможно ли пустить асинхронно?
Надо посмотреть почему не работает виртуализация.
Детализация задана для всех строк или только для выделенных?
Зависание происходит при пуске Приложения или при выделение строки для которой нужно вывести детализацию?
Не вижу ограничения на размер вложенного DataGrid. У вас что все 1000 его строк выводятся в интерфейс одновременно?
0
 Аватар для Andrey-MSK
3162 / 2058 / 376
Регистрация: 14.08.2018
Сообщений: 6,789
Записей в блоге: 4
10.10.2023, 10:18
Denpol, Когда происходит зависание? Откуда читаются данные в DataGrid, из БД? Если да, то сделайте все методы работы с СУБД асинхронными и проверьте. И вот с этим
Цитата Сообщение от Denpol Посмотреть сообщение
В RowsModel часто лежит много строк (иногда больше 10 000)
нужно что-то делать. Никто не грузит по 100500 записей на клиента разом, всегда делаются фильтры, условия, проционность данных.
0
2 / 2 / 2
Регистрация: 13.03.2021
Сообщений: 34
10.10.2023, 10:41  [ТС]
Выгрузка происходит из файла Excel
0
 Аватар для Andrey-MSK
3162 / 2058 / 376
Регистрация: 14.08.2018
Сообщений: 6,789
Записей в блоге: 4
10.10.2023, 10:41
Цитата Сообщение от Denpol Посмотреть сообщение
У меня есть DataGrid, в RowDetailsTemplate которого лежит другой DataGrid:
А вот такое не хотите использовать?
Асинхронный показ DataGrid.RowDetailsTemplate
0
2 / 2 / 2
Регистрация: 13.03.2021
Сообщений: 34
10.10.2023, 10:42  [ТС]
Зависание происходит при нажатии на строку. Все строки выводятся сразу, да
0
 Аватар для Andrey-MSK
3162 / 2058 / 376
Регистрация: 14.08.2018
Сообщений: 6,789
Записей в блоге: 4
10.10.2023, 10:43
Цитата Сообщение от Denpol Посмотреть сообщение
Выгрузка происходит из файла Excel
Сделайте метод выгрузки асинхронным и проверьте. Классы OleDb не поддерживают из коробки варианты с Async. Реализуйте через Task.Run().
0
2 / 2 / 2
Регистрация: 13.03.2021
Сообщений: 34
10.10.2023, 10:50  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Реализуйте через Task.Run().
Выгрузка и так происходит асинхронно. Зависание происходит уже при выборе строчки DataGrid
0
 Аватар для Andrey-MSK
3162 / 2058 / 376
Регистрация: 14.08.2018
Сообщений: 6,789
Записей в блоге: 4
10.10.2023, 10:53
Цитата Сообщение от Denpol Посмотреть сообщение
Выгрузка и так происходит асинхронно.
Покажите все шаги - метод работы с Excel, метод заполнения коллекции для DataGrid в VM.
Цитата Сообщение от Denpol Посмотреть сообщение
Все строки выводятся сразу, да
И поразмышляйте вот над этим
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Никто не грузит по 100500 записей на клиента разом, всегда делаются фильтры, условия, проционность данных.
0
2 / 2 / 2
Регистрация: 13.03.2021
Сообщений: 34
10.10.2023, 10:56  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Зависание происходит при пуске Приложения или при выделение строки для которой нужно вывести детализацию?
При выделении строки

Добавлено через 2 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
И поразмышляйте вот над этим
К сожалению, такое тз. Я был бы рад не выводить все разом, это первое, что пришло мне в голову. Но задачу поставили именно так. И все бы смирились бы над задержкой, но без блокировки приложения целиком. Загрузка файла происходит так:

C# Скопировано
1
2
3
4
5
6
        private async void bLoadFile_Click(object sender, RoutedEventArgs e)
        {
            var file = await ReadModel.ReadFile();
            dgFile.ItemsSource = file.Sheets;
            tbCountRowsAll.Text = file.CountRowsAll.ToString();
        }
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        public async static Task<FileModel> ReadFile()
        {
            var output = new FileModel();
            var fileDialog = new OpenFileDialog();
            fileDialog.Filter = "Excel|*.xls;*.xlsx;";
            fileDialog.ShowDialog();
            output.Name = fileDialog.FileName;
            output.CountRowsAll = 0;
            if (fileDialog.FileName != "")
            {
                var workbook = new Workbook(fileDialog.FileName);
                var collection = workbook.Worksheets;
                try
                {
                    for (int worksheetIndex = 0; worksheetIndex < collection.Count; worksheetIndex++)
                    {
                        await Task.Run(() => FillFile(collection, output, worksheetIndex));
                    }
                }
                catch
                {
                    MessageBox.Show(
                        "Структура файла не соответствует структуре запроса. Выберите другой файл.", 
                        "Внимание!", 
                        MessageBoxButton.OK, 
                        MessageBoxImage.Warning);
                }
            } 
            return output;
        }
0
 Аватар для Andrey-MSK
3162 / 2058 / 376
Регистрация: 14.08.2018
Сообщений: 6,789
Записей в блоге: 4
10.10.2023, 11:00
Цитата Сообщение от Denpol Посмотреть сообщение
Загрузка файла происходит так:
Цитата Сообщение от Denpol Посмотреть сообщение
C# Скопировано
1
FillFile(collection, output, worksheetIndex)
Вот этот метод покажите.
0
2 / 2 / 2
Регистрация: 13.03.2021
Сообщений: 34
10.10.2023, 11:42  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Вот этот метод покажите.
Там обычное заполнение данных в модель в зависимости от ячейки. Ничего особенного, показывать не вижу смысла.

Добавлено через 23 минуты
Оказывается, при помещении DataGrid в ScrollViewer отключается виртуализация. Да, стоило более полно показать код XAML, но я не думал, что может возникнуть такая проблема. Если у кого-нибудь есть решение такой проблемы - буду рад помощи. Заранее спасибо
0
2 / 2 / 2
Регистрация: 13.03.2021
Сообщений: 34
10.10.2023, 11:42  [ТС]
Лучший ответ Сообщение было отмечено Элд Хасп как решение

Решение

Добавлено через 14 минут
Решил проблему. Потребовалось лишь добавить ограничение по высоте DataGrid в RowDetailsTemplate. Всем спасибо за помощь!

XML Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
                    <DataGrid.RowDetailsTemplate>
                        <DataTemplate>
                            <DataGrid ItemsSource="{Binding RowsModels}" AutoGenerateColumns="False" IsReadOnly="True" [B]MaxHeight="500"[/B]>
                                <DataGrid.Columns>
                                    <DataGridTextColumn Binding="{Binding Number}" Header="№ п/п"/>
                                    <DataGridTextColumn Binding="{Binding Address}" Header="Адрес"/>
                                    <DataGridTextColumn Binding="{Binding HouseNumber}" Header="Дом"/>
                                    <DataGridTextColumn Binding="{Binding Fias}" Header="Уникальный номер адресообразующего элемента в государственном адресном реестре"/>
                                </DataGrid.Columns>
                            </DataGrid>
                        </DataTemplate>
                    </DataGrid.RowDetailsTemplate>
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
15966 / 11100 / 2866
Регистрация: 21.04.2018
Сообщений: 32,628
Записей в блоге: 2
10.10.2023, 11:57
Цитата Сообщение от Denpol Посмотреть сообщение
При выделении строки
И Сразу выводите все 1000 строк детализации?
Задайте ограничение внутреннего DataGrid MaxHeight="...". По идее должна включиться виртуализация для строк что не попадут в этот размер.

Добавлено через 1 минуту
Цитата Сообщение от Denpol Посмотреть сообщение
DataGrid в ScrollViewer отключается виртуализация.
Естественно.
Для виртуализации нужно ограничение размера, а ScrollViewer предоставляет бесконечный область для дочернего элемента.

Добавлено через 41 секунду
Цитата Сообщение от Denpol Посмотреть сообщение
Потребовалось лишь добавить ограничение по высоте DataGrid в RowDetailsTemplate.
Ну,.... пока писал, вы уже сами нашли решение.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.10.2023, 11:57
Помогаю со студенческими работами здесь

Как получить имя объекта находящегося в DataGrid.RowDetailsTemplate
Как получить имя объекта находящегося в DataGrid.RowDetailsTemplate? это описано в xaml &lt;data:dataGrid x:Name=&quot;dg1&quot;&gt;...

Скрыть/показать RowDetailsTemplate по клику на строке DataGrid MVVM
Не получается сделать так, чтоб при первом клике на строку просто выбирался элемент, при повторном нажатии показывался RowDetailsTemplate а...

Как при использовании свойства DataGrid.RowDetailsTemplate вызвать команду? MVVM
Есть таблица с определенными данными допустим пусть в каждой строке будут два значения a и b надо чтобы в RowDetailsTemplate выводился...

WPF MVVM, Сокрытие и показ столбцов DataGrid
Добрый день! Пытаюсь реализовать возможность пользователю выбрать те столбцы таблицы, которые необходимы. Пока безуспешно:wall: ...

DataGrid.RowDetailsTemplate, рекурсивно отобразить innerException (рекурсия должна продолжаться до значения null)
Всем привет! Есть DataGrid, в который записываются логи из программы. Хотелось бы, чтобы при клике на строку (она же сообщение лога)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Максимальная производительность C#: Span<T> и Memory<T>
stackOverflow 22.04.2025
Мир высоконагруженных приложений безжалостен к неэффективному коду. Каждая миллисекунда на счету, каждый выделенный байт памяти может стать причиной падения производительности. Разработчики на C#. . .
JWT аутентификация в Java
Javaican 21.04.2025
JWT (JSON Web Token) представляет собой открытый стандарт (RFC 7519), который определяет компактный и самодостаточный способ передачи информации между сторонами в виде JSON-объекта. Эта информация. . .
Спринты Agile: Планирование, выполнение, ревью и ретроспектива
EggHead 21.04.2025
Спринты — сердцевина Agile-методологии, позволяющая командам создавать работающий продукт итерационно, с постоянной проверкой гипотез и адаптацией к изменениям. В основе концепции спринтов лежит. . .
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров
Programma_Boinc 21.04.2025
Очередные открытия мега простых чисел, сделанные добровольцами с помощью домашних компьютеров. 3 марта 2025 года, в результате обобщенного поиска простых чисел Ферма в PrimeGrid был найден. . .
Система статов в Unity
GameUnited 20.04.2025
Статы — фундаментальный элемент игрового дизайна, который определяет характеристики персонажей, предметов и других объектов в игровом мире. Будь то показатель силы в RPG, скорость передвижения в. . .
Статические свойства и методы в TypeScript
run.dev 20.04.2025
TypeScript прочно занял своё место в системе современной веб-разработки. Этот строго типизированный язык программирования не просто расширяет возможности JavaScript — он делает разработку более. . .
Batch Transform и Batch Gizmo Drawing API в Unity
GameUnited 20.04.2025
В мире разработки игр и приложений на Unity производительность всегда была критическим фактором успеха. Создатели игр постоянно балансируют между визуальной привлекательностью и плавностью работы. . .
Звук в Unity: Рандомизация с Audio Random Container
GameUnited 20.04.2025
В современных играх звуковое оформление часто становится элементом, который либо полностью погружает игрока в виртуальный мир, либо разрушает атмосферу за считанные минуты. Представьте: вы исследуете. . .
Максимальная производительность C#: Советы, тестирование и заключение
stackOverflow 20.04.2025
Погружение в мир микрооптимизаций C# открывает перед разработчиком целый арсенал мощных техник. Но как определить, где и когда их применять? Ответ начинается с точных измерений и профилирования. . . .
Максимальная производительность C#: Предсказание ветвлений
stackOverflow 20.04.2025
Третий ключевой аспект низкоуровневой оптимизации — предсказание ветвлений. Эта тема менее известна среди разработчиков, но её влияние на производительность может быть колоссальным. Чтобы понять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер