Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
399 / 318 / 53
Регистрация: 14.08.2014
Сообщений: 1,010

Сохранение настроек динамически добавленных контролов

23.01.2019, 16:36. Показов 1533. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую!
Ребзя, нужен ваш совет.

Суть такая.
Есть основная форма.
В эту форму, из dll, динамически подгружается юзерконтрол, в котором TabControl с вкладками и на каждой вкладке может быть всё что угодно (по сути, любой контрол, который есть в тулбоксе VS).
При закрытии основной формы, нужно каким-то образом сохранить состояние и значения всех динамически подгруженных контролов.

Если бы было заранее известно какие контролы будут в dll, то можно было бы создать класс с полями, далее сериализовать его и сохранить как бинарник. Или в тот же JSON всё сохранить, не суть.
Поскольку о контролах ничего неизвестно, то и класс написать не могу. Топчусь сейчас на месте и не знаю что делать с этой бедой
Если рассуждать логически, то нужно перебрать все контролы, получить их тип и каким-то образом основываясь на типе контрола, нужно подобрать соответствующий контейнер или что-то подобное, чтобы сохранить в него данные контрола.
Для меня это темный лес, да и не знаю даже возможно ли такое провернуть.
Взять например тот же DGV, вот что с ним делать, если он прилетит из dll? Причем, ладно сохранить, это ещё пол беды. А как потом всё это обратно проинициализировать в котролы?

Как наиболее грамотно можно решить подобную задачу?
Наверное код для решения подобной задачи будет монструозным в плане объема, поэтому готового решения не прошу. Мне бы просто понять вектор и в какую сторону копать.
Буду очень благодарен за любую помощь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.01.2019, 16:36
Ответы с готовыми решениями:

Отображение в дизайнере контролов, добавленных программно
Добрый вечер! Хочу написать контрол, содержащий полярную систему координат. Оси (эллипсы и прямые линии) создаю программно и...

Прокрутка динамически добавленных элементов
Всем привет! В общем, появилась вот такая задача - на форму надо динамически добавить несколько элементов TDBChart, один под другим. Их...

Изменение динамически добавленных Input
Доброго всем дня. При нажатии на кнопку открывается fancybox, нужно достать значения элементов хранящихся в данном боксе а именно...

21
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
23.01.2019, 16:44
Дядя Корней, а какие свойства из каждого отдельного контрола будут использоваться вам известно заранее? можно сериализовать только конкретные свойства, есть пример, щас поищу, давал мне ovva

Добавлено через 3 минуты
нашел, вот такая штука для сериализации КНОПКИ, может что-то с этим придумаете:
VB.NET
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Private Sub serButton(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    'создаем кнопку
    Dim btn01 As New myBtn
    btn01.Width = 80
    btn01.Height = 40
    btn01.Text = "My Button"
    btn01.Location = New Point(800, 280)
    
    'сериализуем
    Dim stream As Stream = File.Open("serBtn.dat", FileMode.Create)
    Dim formatter As New BinaryFormatter()
    Try
        formatter.Serialize(stream, btn01)
        MsgBox("theEnd")
    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        stream.Close()
        btn01 = Nothing
        formatter = Nothing
    End Try
End Sub
 
 
 
 
Private Sub deserButton(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    'Грузим из файла в память
    Dim stream As Stream = File.Open("serBtn.dat", FileMode.Open)
    Dim formatter As New BinaryFormatter()
    
    'Десериализуем и вставляем на форму
    Dim btn02 As New myBtn
    Try
        btn02 = CType(formatter.Deserialize(stream), myBtn)
        Me.Controls.Add(btn02)
    Catch ex As Exception
        MsgBox(ex.ToString)
    Finally
        stream.Close()
        btn02 = Nothing
        formatter = Nothing
    End Try
End Sub
 
 
 
 
 
 
'…
Imports System.Runtime.Serialization
Imports System.Security.Permissions
<Serializable()> _
Public Class myBtn
    Inherits Button
    Implements ISerializable
    Public Sub New()
    End Sub
    Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
        Dim pp As New Point
        Me.Width = info.GetString("Width")
        Me.Height = info.GetString("Height")
        pp.X = info.GetString("Left")
        pp.Y = info.GetString("Top")
        Me.Text = info.GetString("Text")
        Me.Location = pp
    End Sub
    <SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter:=True)> _
    Public Overridable Sub GetObjectData(ByVal info As SerializationInfo, ByVal context As StreamingContext) Implements ISerializable.GetObjectData
        If info Is Nothing Then
            Throw New System.ArgumentNullException("GetObjectData: info")
        End If
        info.AddValue("Width", Me.Width)
        info.AddValue("Height", Me.Height)
        info.AddValue("Left", Me.Location.X)
        info.AddValue("Top", Me.Location.Y)
        info.AddValue("Text", Me.Text)
    End Sub
End Class
1
399 / 318 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
24.01.2019, 12:22  [ТС]
Цитата Сообщение от Yury Komar Посмотреть сообщение
а какие свойства из каждого отдельного контрола будут использоваться вам известно заранее?
dll это код, написанный сторонними разработчиками. Что они там понапишут, одному богу известно.
А сохранить нужно состояние и значение контролов, т.е. координаты, размеры и что-то подобное не нужно сохранять.
Т.е., если это чекбокс, то нужно сохранить его состояние - True/False.
Если это текстбокс, то сохранить свойство - Text.
Если NumericUpDown, то сохранить Value.
ComboBox - Items.
DGV - DataTable Or Rows, если DT отсутствует.
...
и т.д.

Добавлено через 18 минут
На данный момент сделал метод расширение для контролов, чтобы рекурсивно можно было получить все контролы из указанного контрола и его контейнеров:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Module ControlExtension
    <Runtime.CompilerServices.Extension()>
    Function GetAllChildren(ByRef container As Control) As List(Of Control)
        Dim children As New List(Of Control)
 
        If container.HasChildren = False Then
            Return Nothing
        Else
            Dim objControl As Control
            For Each objControl In container.Controls
                children.Add(objControl)
 
                If objControl.HasChildren Then
                    children.AddRange(objControl.GetAllChildren())
                End If
            Next
        End If
 
        Return children
 
    End Function
End Module
Далее соответственно применяем метод:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Private Sub ButtonSaveSettings_Click(sender As Object, e As EventArgs) Handles ButtonSaveSettings.Click
        Try
 
            'PluginContainer - это TabPage на основной форме. 
            'В TabPage(из dll) динамически подгружается TabControl (.Name = Plugin) с любым кол-вом вкладок и контролов. 
            Dim plugin = PluginContainer.Controls.Find("Plugin", True).FirstOrDefault()
            Dim pluginControls As List(Of Control) = plugin.GetAllChildren()
 
            For Each pControl As Control In pluginControls
 
            Next
 
        Catch ex As Exception
            Log(ex.Message)
        End Try
    End Sub
Вот дальше у меня дилемма.
Можно поступить двумя способами:
1. В цикле пройтись по всем контролам, которые в pluginControls и проверить их на IsSerializable и разложить на два массива:
a) контролы поддерживающие сериализацию.
b) контролы не поддерживающие сериализацию.

Далее, те, которые в массиве - a, их просто сериализовать в бинарник, те, которые в массиве - b, ??? с ними не знаю пока что делать.
Нужно каким-то образом понять, какого типа Value у контрола и исходя из этого создать объект для хранения Value. Пока не знаю как это сделать более грамотно.

2. Можно не проверять на IsSerializable и не раскладывать контролы по разным массивам и вернуться к вопросу - Нужно каким-то образом понять, какого типа Value у контрола и исходя из этого создать объект для хранения.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
24.01.2019, 12:25
Дядя Корней, Хм, так вам ведь их потом нужно будет вернуть на место? доесть ДеСериализовать? Тут без координат никак ведь.?
0
399 / 318 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
24.01.2019, 12:46  [ТС]
Yury Komar, не, это по другому делается, не по координатам.
Из примера выше:
VB.NET
1
2
Dim btn02 As New myBtn
btn02 = CType(formatter.Deserialize(stream), myBtn)
Грубо говоря, создается новый объект и десериализованный объект, заливается в новый.
Я это планирую делать по имени объекта.

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

Добавлено через 7 минут
Сейчас меня только вот это держит:
Цитата Сообщение от Дядя Корней Посмотреть сообщение
Нужно каким-то образом понять, какого типа Value у контрола и исходя из этого создать объект для хранения.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
24.01.2019, 13:04
Дядя Корней, ну может быть в имя контрола включить какой-то маркер по которому можно определить его тип и действовать соответственно. или в свойство Tag это прописать и брать оттуда.
0
 Аватар для Nachrichter
649 / 601 / 92
Регистрация: 19.03.2012
Сообщений: 1,128
24.01.2019, 13:29
Если я Вас правильно понял, то
Цитата Сообщение от Дядя Корней Посмотреть сообщение
Я это планирую делать по имени объекта.
"Имя вы не зря даёте и скажу вам наперёд..."
Цитата Сообщение от Дядя Корней Посмотреть сообщение
Нужно каким-то образом понять, какого типа Value у контрола и исходя из этого создать объект для хранения Value.
Как контрол Вы назовёте, так потом у Вас попрёт: txtName, chkName, cmbName и т.п. Это касаемо типа, ещё можно цифровой индекс добавлять.
1
399 / 318 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
24.01.2019, 14:06  [ТС]
Yury Komar, Nachrichter, ой ребят, не, боже упаси. Это же будет самый настоящий стыд, или быдло код, называйте как хотите ))
Фактически, мы должны будем опозориться и сказать другим разработчикам, чтобы при написании плагинов, они использовали какие-то там маркеры или метки в именах.

Эх, ладно. Пойду в корпарат библиотеку изучать книги. Я уверен на 100%, что в NET есть инструменты для различной манипуляции с объектами, нужно только найти "ЭТО", что собственно, как всегда и займет 90% всего времени для решения задачи. Как всегда, 90% времени ищешь и 5 минут пишешь код.

Я отпишусь ещё, если окончательно зайду в тупик или решу задачу.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
24.01.2019, 14:13
Дядя Корней, Не совсем понял, имена контролам назначаются на стадии их разработки/написания чтоли? Это как?

Добавлено через 56 секунд
Ведь вы в своем ПО динамически добавляете контролы? И имена им даете ВЫ. Или не так?
0
399 / 318 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
24.01.2019, 14:22  [ТС]
Цитата Сообщение от Yury Komar Посмотреть сообщение
Ведь вы в своем ПО динамически добавляете контролы? И имена им даете ВЫ. Или не так?
Нет, не так.
Как я выше писал, ПО, это всего лишь оболочка(форма) с контейнером. В этот контейнер из dll динамически подгружаются контролы. Соответственно, ПО ничего не знает о контролах и именах контролов, которые она загрузила в свой контейнер.

dll пишут сторонние разработчики, собственно, поэтому о контролах и их именах ничего неизвестно.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
24.01.2019, 14:33
Дядя Корней, и правда нестандартная ситуация
Ну как найдете решение - сообщите, тоже интересно
1
399 / 318 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
24.01.2019, 14:42  [ТС]
Цитата Сообщение от Yury Komar Посмотреть сообщение
Ну как найдете решение - сообщите, тоже интересно
Хорошо,
Цитата Сообщение от Дядя Корней Посмотреть сообщение
Я отпишусь ещё, если окончательно зайду в тупик или решу задачу.
0
 Аватар для Nachrichter
649 / 601 / 92
Регистрация: 19.03.2012
Сообщений: 1,128
24.01.2019, 14:58
Цитата Сообщение от Дядя Корней Посмотреть сообщение
Пойду в корпарат библиотеку изучать книги. Я уверен на 100%, что в NET есть инструменты для различной манипуляции с объектами, нужно только найти "ЭТО", что собственно, как всегда и займет 90% всего времени для решения задачи.
Не разделяю Вашей уверенности, но и не согласиться не могу. Буду признателен, если поделитесь изысканиями!
0
1548 / 1521 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
24.01.2019, 15:42
Дядя Корней, может это как-то поможет (через рефлексию)
VB.NET
1
2
3
4
5
6
7
8
9
10
11
For Each c As Control In Me.Controls
            Dim t = c.GetType
            MsgBox(c.GetType.Name)
            For Each mi In t.GetMembers()
                If mi.MemberType = MemberTypes.Property Then
                    For Each prop In CType(mi, PropertyInfo).GetAccessors()
                        MsgBox(prop.Name & vbCrLf & prop.ReturnType.Name)
                    Next
                End If
            Next
        Next
Это то, что по быстрому сумел накропать. Там (в System.Reflection) много чего есть интересного.
2
399 / 318 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
24.01.2019, 15:47  [ТС]
Цитата Сообщение от MrCrown Посмотреть сообщение
Там (в System.Reflection) много чего есть интересного.
Угу, ушел как раз сейчас в эту область.
Сериализацию и сохранение я уже сделал, это оказалось не сложно.

Осталось только обратную инициализацию контролов сделать. Над этим пока работаю.
0
1548 / 1521 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
24.01.2019, 16:51
Дядя Корней, вот еще вариант, как получить свойства контрола
VB.NET
1
2
3
4
5
Private Sub GetPropName(ByVal ctrl As Control)
        For Each prop In ctrl.GetType.GetProperties
            ListBox1.Items.Add(prop.Name)
        Next
    End Sub
2
399 / 318 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
24.01.2019, 17:35  [ТС]
MrCrown, с получением я уже решил вопрос.
Цитата Сообщение от Дядя Корней Посмотреть сообщение
Сериализацию и сохранение я уже сделал, это оказалось не сложно.
Теперь нужно полученные свойства и их значения обратно в контролы сохранить. С этим пока проблемы.

Добавлено через 31 минуту
Всё, сделал!
Больше никаких XML, INI файлов, убогих Properties.Settings и прочих мучений. Всё настраивается, меньше, чем за минуту и так же просто используется.

Сейчас я быстренько сваливаю домой, пока пробки не начались.
Завтра утром выложу готовый класс.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
25.01.2019, 01:00
Дядя Корней, отлично. Аж не терпится увидеть сие творение...
Больше понравилась фраза - Больше никаких XML, INI и т.п. ))
0
85 / 75 / 15
Регистрация: 18.01.2014
Сообщений: 359
25.01.2019, 05:32
Может в саму дллку сохраняет...
0
399 / 318 / 53
Регистрация: 14.08.2014
Сообщений: 1,010
25.01.2019, 14:23  [ТС]
Цитата Сообщение от Yury Komar Посмотреть сообщение
отлично. Аж не терпится увидеть сие творение...
Обязательно поделюсь.
У нас тут как всегда под конец месяца завал, пришлось переключиться на помощь, чтобы доделать кое-что в других проектах.

Как освобожусь, создам отдельный тестовый проект. Добавлю в него для наглядности контролов, вынесу класс с сохранением из нашего рабочего решения в тестовый проект и залью сюда на форум.
Просто в текущем виде класс слегка заточен под свои задачи и его нужно привести в стандарт, чтобы подходил под любые проекты.

Цитата Сообщение от _Radik_ Посмотреть сообщение
Может в саму дллку сохраняет...
Не, зачем?
Рефлексия + стандартные NET классы для работы с объектами + сериализация + запись в бинарник = решение задачи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.01.2019, 14:23
Помогаю со студенческими работами здесь

Обработчик динамически добавленных кнопок
Здравствуйте, помогите, пожалуйста. По нажатию на кнопку создаю новые кнопки и добавляю их на форму int colbutton = 0; ...

Для динамически добавленных элементов не работает JS
Скачал плагин календаря для инпута. То есть при нажатии по инпуту появляется календарик и выбирается дата. Обязательное условие чтобы инпут...

JS не работает для динамически добавленных элементов
Скачал я js плагин и css к нему календаря для вставки даты в инпут. Все работает только для тех инпутов, которые уже находятся на...

События для динамически добавленных элементов
Всем доброго дня (ночи, утра, вечера). Столкнулся с такой проблемой, имеется функция выполняющая ajax запрос и возвращающая несколько...

Скрытие динамически добавленных через Ajax элементов
Здравствуйте, уважаемые дамы и господа. На вашем форуме я впервые. Относительно недавно начал знакомиться и разбираться с jquery. В...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru