Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 14.10.2014
Сообщений: 57

Хранение и отображение на форме сложных объектов

23.04.2019, 17:32. Показов 2671. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Имеется сложный класс Mess:

C#
1
2
3
4
5
6
7
8
9
10
public class Header {
    public uint commLength;
    public uint commID;
    public uint commStat;
    public uint commSN;
}
public class Mess {
    public Header head;
    public byte[] content;
}
При обработке Mess его content парсится (из него "вытаскивается" множество разных параметров разных типов - кроме обычных string и int, например byte[]). Как бы "половчее" хранить коллекцию этих объектов (или наследников) с отображением их на форме в виде таблицы (с добавлением иконок в отдельной колонке).
Хотел использовать DataGridView, но в нем нет типа ячеек для byte[] или совсем экзотического типа того же Header (эти поля не должны быть видимы, но доступны)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.04.2019, 17:32
Ответы с готовыми решениями:

Наложение текстуры в Maya: отображение сложных объектов в программе
Доброго времени! Есть такая проблема, при наложении текстуры на простенькие модели всё работает как надо(наколенники справа), но при...

Отображение объектов на новой форме
При вызове формы из формы появляется следующая неприятность. В новой форме должна только строиться фигура по данным из родительской...

Хранение сложных структур данных в БД
Возникла такая проблема: У меня есть N категорий сайтов. У каждого сайта есть M частей. Каждая часть имеет K пар...

7
SETI
 Аватар для orestsyn
64 / 49 / 18
Регистрация: 09.04.2018
Сообщений: 210
23.04.2019, 17:39
RedScorpio, Сериализацию пробовали? XML, JSON?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
23.04.2019, 17:40
Цитата Сообщение от RedScorpio Посмотреть сообщение
Хотел использовать DataGridView, но в нем нет типа ячеек для byte[] или совсем экзотического типа того же Header (эти поля не должны быть видимы, но доступны)
ToString не вариант переопределить?
0
0 / 0 / 0
Регистрация: 14.10.2014
Сообщений: 57
23.04.2019, 17:50  [ТС]
Цитата Сообщение от orestsyn Посмотреть сообщение
Сериализацию пробовали? XML, JSON?
Не пробовал. Разбираться с C# только начинаю, не дошел... Да, насколько понимаю, это немного не то (или не понимаю вовсе)
Цитата Сообщение от Someone007 Посмотреть сообщение
ToString не вариант переопределить?
А чем это может помочь? В наследнике многие поля "выдернуты" из content, но мне нужно и его сохранять
0
SETI
 Аватар для orestsyn
64 / 49 / 18
Регистрация: 09.04.2018
Сообщений: 210
23.04.2019, 19:03
RedScorpio, Эти форматы созданы для того, чтобы хранить в них данные и транспортировать их. Почитайте про сериализацию и десериализацию, думаю это именно то, что вам нужно.
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
23.04.2019, 20:01
RedScorpio, Хранить и отображать - две разные задачи.
Хранить данные в элементах управления, либо отображения - крайне плохая идея.
Для хранения данных используйте, например, сериализацию, как Вам советовали выше. Для отображения - тот же datagridview.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
23.04.2019, 20:10
Лучший ответ Сообщение было отмечено RedScorpio как решение

Решение

Цитата Сообщение от RedScorpio Посмотреть сообщение
Как бы "половчее" хранить коллекцию этих объектов (или наследников) с отображением их на форме в виде таблицы (с добавлением иконок в отдельной колонке).
1) Для хранения списка Mess создайте класс Messes следующего содержания:
C#
1
2
3
    public class Messes : List<Mess>
    {
    }
2) Для отображения в DataGridView можно использовать разные подходы. Один из них следующий:
Создаем класс-обертку(wrapper) для отображения класса Mess:
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
    public class MessView
    {
        internal Mess Mess { get; private set; }
 
        public uint CommID
        {
            get => Mess.head.commID;
            set => Mess.head.commID = value;
        }
 
        public uint CommLength
        {
            get => Mess.head.commLength;
            set => Mess.head.commLength = value;
        }
 
        public string Content
        {
            get => string.Join(" ", Mess.content);
        }
 
        public MessView(Mess mess)
        {
            this.Mess = mess;
        }
    }
И далее просто привязываем наш список объектов к датагриду через механизм binding:
C#
1
dgvMain.DataSource = messess.Select(m => new MessView(m)).ToList();
Результат:


Проект целиком:
Вложения
Тип файла: zip WindowsFormsApp2.zip (38.9 Кб, 2 просмотров)
1
0 / 0 / 0
Регистрация: 14.10.2014
Сообщений: 57
24.04.2019, 18:31  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Проект целиком:
Да, очент похоже на то, что мне нужно. Только у меня возникли трудности:
Как правильно обновлять DataGridView при изменении List? В вашем проекте я просто добавил
C#
1
dgvMain.DataSource = messess.Select(m => new MessView(m)).ToList();
после каждого
C#
1
messess.Add(newMess);
В Вашем примере это работает, но в том приложении, которое я пытаюсь собрать, выполнение binding которое вызывается из другого класса (тот класс имеет событие, на которое подписывается форма) вызывает исключение (если сделать кнопкой на форме - никаких проблем, все обновляется).

PS. Не совсем понял задумку с созданием наследника от List, в котором нет никаких новых свойств

Добавлено через 7 минут
Цитата Сообщение от orestsyn Посмотреть сообщение
Эти форматы созданы для того, чтобы хранить в них данные и транспортировать их. Почитайте про сериализацию и десериализацию, думаю это именно то, что вам нужно.
Нет, в моем случае, в принципе, достаточно List для хранения (транспортный протокол уже определен и он стандартный, а хранить нужно немного и только на время работы программы - для отображения, фиксирования ответов о состоянии, возможной отправки отчетов со ссылкой на первоначальное сообщение и т.д.). Я просто не мог додуматься о том, как загнать нестандартное в таблицу

Добавлено через 48 минут
Цитата Сообщение от RedScorpio Посмотреть сообщение
вызывает исключение
Понял, почему - класс и форма работают в разных Thread-ах.
Но не понял, как лечить...

Добавлено через 3 часа 48 минут
Сделал так
Обновление DataGridView
C#
1
2
3
4
5
6
7
8
9
10
        private delegate void UpdateDGV();
        static object locker = new object();
        private void UpDGV() {
            lock (locker) {
                DGView.DataSource = messess.Select(m => new MessView(m)).ToList();
                if (DGView.Rows.Count > 0) {
                    DGView.CurrentCell = DGView.Rows[DGView.Rows.Count - 1].Cells[0];
                }
            }
        }
Вызов
C#
1
            this.Invoke(new UpdateDGV(this.UpDGV),new object[] {   });
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.04.2019, 18:31
Помогаю со студенческими работами здесь

Хранение сложных классов в контейнере
Всем, привет. Прошу помощи в одной проблемке. В общем у нас должны быть два контейнера. Один должен хранить объекты по значению, а...

Динамический массив из сложных объектов
Есть динамич массив из сложных объектов A : array of TStaticText; нужна процедура удаления объектов, расположенных в середине...

Создание сложных объектов с возможностью их окрашивания
Мне было трудно подобрать годное название сего треда по причине сложности задачи. У меня есть приложение, генерирующее флаги...

Класс для нескольких сложных объектов
Здравствуйте! Столкнулся с такой задачей - необходимо создать модель трех реальных объектов, технически сложных устройств, одной марки. Для...

сдвиг в массиве состоящим из сложных объектов
Есть массив A: array of TMyObject удаляем А элемент командой FreeAndNil (А) Вопрос Как теперь передвинуть все последующие назад ,те...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru