powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Единый AddHandler для всех Control-ов созданных динамически
13 сообщений из 13, страница 1 из 1
Единый AddHandler для всех Control-ов созданных динамически
    #39236657
MAGRAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток форумчане!
Хочу иметь единый обработчик событий для всех Button-ов созданных мною динамически.

Код: vbnet
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.
    'для каждой кнопки использую такую процедуру HelpAddButton1/HelpAddButton2/HelpAddButton3/...
    Public Sub HelpAddButton2()
        Dim iPanel As Panel
        Dim Width As Integer
        Dim Height As Integer
        Dim Local_X As Integer
        Dim Local_Y As Integer

        Width = 110
        Height = 23
        Local_X = 4 + 200 + 4 + 130 + 4 + 100 + 4
        Local_Y = 4
        iPanel = Me.Controls.Item("Panel1")
        CreateNewButton("Button2", iForm, iPanel, Local_X, Local_Y, Width, Height, "Редактор")
    End Sub

    'Добавляем программно в проект новый Button
    Public Sub CreateNewButton(ByVal iName As String, _
                               ByVal ParentForm0 As Object, _
                               ByVal ParentForm As Object, _
                               ByVal LocationX As Integer, _
                               ByVal LocationY As Integer, _
                               ByVal BWidth As Integer, _
                               ByVal BHeight As Integer, _
                               ByVal iText As String)
        Dim iButton As New Button ' НОВЫЙ элемент Button

        If CreateControlWithName(ParentForm, iName) = False Then
            AddHandler iButton.Click, AddressOf ParentForm0.iButton_Click
            ParentForm.Controls.Add(iButton)

        Else
            iButton = ParentForm.Controls.Item(iName)
        End If

        iButton.Name = iName
        iButton.Location = New System.Drawing.Point(LocationX, LocationY)
        iButton.Size = New System.Drawing.Size(BWidth, BHeight)
        iButton.Text = iText
    End Sub



Первое создание кнопки с AddHandler-ом проходит успешно, что не удивительно.
Второй такой же номер уже не проходит так как, я думаю, AddHandler iButton.Click, AddressOf ParentForm0.iButton_Click уже создан и второй раз это провернуть не выйдет.
Пытался найти решение этой проблемы путем проверки на предмет существования AddHandler iButton.Click, AddressOf ParentForm0.iButton_Click, но ничего не нашёл. Возможно я идеологически иду неверным путем и так вообще никогда нормальные люди не поступают.
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39236716
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все правильно делаешь, должно работать. У меня в цикле вызывается такая функция, и все нормально:

Код: vbnet
1.
2.
3.
4.
5.
    Private Function CreateHyper(sText As String) As Hyperlink
        Dim hl As New Hyperlink(New Run(sText)) With {.ToolTip = "Набрать номер"}
        AddHandler hl.Click, AddressOf Me.HLClick
        Return hl
    End Function


Попробуй Dim iButton As New Button With {.Name = iName}

А еще можешь написать, с какими ошибками "не проходит".
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39236734
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAGRAV, перечитайте сообщение об ошибке... там поди InvalidCastException?
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39237112
MAGRAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во всём разобрался. Проблема была в другом.
В таком случае я просто приведу пример как я работаю с динамически созданными Control-ами и их событиями на примере ComboBox.

Код: vbnet
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.
#Region "События iComboBox"
    'изменяем значения выбранного параметра в iComboBox
    Public Sub iComboBox_SelectedIndexChanged(sender As System.Object, e As System.EventArgs)
        Dim iPanel As Panel 'В моём случае я зачем-то размещаю Panel на Form, а уж потом добавляю на Panel Batton-ы и ComboBox-ы
        iPanel = Me.Controls.Item("Panel1")
        iComboBox = iPanel.Controls.Item(sender.Name)'Таким способом я указываю имя того ComboBox с которым сейчас работаю. Это и было источником ошибки в самом начале.
        iParameter = iComboBox.SelectedIndex
        CreateOneParameterTXTData(iParameter, TXTData, TXTDataList)' Мои подпрограммы
        START(TXTData, ServiseData)'                                                и логика
    End Sub
#End Region

    'Добавляем программно в проект новый ComboBox
    Public Sub CreateNewComboBox(ByVal iName As String, _
                                 ByVal ParentForm0 As Object, _
                                 ByVal ParentForm As Object, _
                                 ByVal LocationX As Integer, _
                                 ByVal LocationY As Integer, _
                                 ByVal CBWidth As Integer, _
                                 ByVal CBHeight As Integer)
        Dim iComboBox As New ComboBox ' НОВЫЙ элемент ComboBox

        If CreateControlWithName(ParentForm, iName) = False Then
            'RemoveHandler iComboBox.SelectedIndexChanged, AddressOf ParentForm0.iComboBox_SelectedIndexChanged
            AddHandler iComboBox.SelectedIndexChanged, AddressOf ParentForm0.iComboBox_SelectedIndexChanged
            ParentForm.Controls.Add(iComboBox)
        Else
            iComboBox = ParentForm.Controls.Item(iName)
        End If
        iComboBox.Name = iName
        iComboBox.Location = New System.Drawing.Point(LocationX, LocationY)
        iComboBox.Size = New System.Drawing.Size(CBWidth, CBHeight)
    End Sub

    'функция определяющая создан ли Control с именем "name" в данном проекте
    Public Function CreateControlWithName(ByVal iForm As Object, ByVal name As String) As Boolean
        Dim sss As String
        Dim i As Integer
        CreateControlWithName = False
        For i = 0 To iForm.Controls.Count - 1
            sss = iForm.Controls(i).Name
            If Trim(name) = Trim(sss) Then
                CreateControlWithName = True
                Exit For
            End If
        Next i
    End Function
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39237158
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
MAGRAVя просто приведу пример как я работаю с динамически созданными Control-ами и их событиями на примере ComboBox
А зачем вы создаете контролы динамически?
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39237180
MAGRAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cat2,

По большей части так из спортивного интереса почти все элементы управления добавляю именно таким способом. Больше неприятностей от этого. Разве что греет мысль, что если придётся переезжать на СИ-языки то возни с конструктором будет меньше.
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39237204
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2MAGRAVя просто приведу пример как я работаю с динамически созданными Control-ами и их событиями на примере ComboBox
А зачем вы создаете контролы динамически?

Меня больше интересует как он потом их выравнивает и прилепляет к другим контролам/контейнерам в формах с достаточно сложным UI. Как потом накручивает БЛ к ним. Как высчитывает нужные размеры и т.д.
Имхо такое надо пресекать на начальном этапе.
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39237470
MAGRAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LameUser,
Боюсь что устану все-все рассказывать. Но вот хотябы самое очевидное:
Код: vbnet
1.
2.
3.
4.
Me.iPictureBox.Anchor = (System.Windows.Forms.AnchorStyles.Top Or _
                                     System.Windows.Forms.AnchorStyles.Bottom Or _
                                     System.Windows.Forms.AnchorStyles.Left Or _
                                     System.Windows.Forms.AnchorStyles.Right)
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39238120
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAGRAVLameUser,
Боюсь что устану все-все рассказывать. Но вот хотябы самое очевидное:
Код: vbnet
1.
2.
3.
4.
Me.iPictureBox.Anchor = (System.Windows.Forms.AnchorStyles.Top Or _
                                     System.Windows.Forms.AnchorStyles.Bottom Or _
                                     System.Windows.Forms.AnchorStyles.Left Or _
                                     System.Windows.Forms.AnchorStyles.Right)



Если бы делали нормально - не пришлось бы.
Я пытаюсь понять в чем же такая необходимость писать ручками код, который автоматически генерируется дизайнером (про отладку умолчим). Вы не думали, что помимо вас потом с этим проектом могут работать другие разработчики? Как вы думаете они отнесутся к вашей самодеятельности?

Я особенно люблю вот такие волшебные, неименованные константы в такого рода поделках.
Код: c#
1.
Local_X = 4 + 200 + 4 + 130 + 4 + 100 + 4


Я почти уверен, что если вы не будете работать в проекте год и потом откроете это место - то вы вряд ли вспомните назначение этих волшебных цифр.
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39238173
MAGRAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LameUser,
Софтина не совсем стандартная. В ней реализуются много разных сценариев которые сложно увязать в один интерфейс. Поэтому и иду путём такого вот кукольного театра. Не хотелось плодить много Form со всеми необходимыми контролами. Мне бы это никак не упростило жизнь. У заказчика много противоречивых требований и как-то лаконично и красиво их увязать в одном интерфейсе та ещё задачка. Долгострой. Факультатив почти.

Код: vbnet
1.
Local_X = 4 + 200 + 4 + 130 + 4 + 100 + 4


Это очень понятная запись. Она хранит в себе инфу о расположении и размерах контролов, которые как бы раньше идут по координате Х )))
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39238182
MAGRAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LameUser,
Говорил же, что вероятно будет необходимость перезжать на другой язык и быстро. Был у меня уже опыт написания многооконного приложения с кучей контролов. Так вот когда этот красивосложенный мамонт на VB6 состарился окончательно, что-то в его контролах уже никак не поддавалось конвертации на более новую платформу. Намучался я тогда. Не все приложения должны быть похожи на MS Excel.
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39238185
MAGRAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LameUser,

Тот старый мамонт на VB6:

YouTube Video
...
Рейтинг: 0 / 0
Единый AddHandler для всех Control-ов созданных динамически
    #39238727
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAGRAVLameUser,
Софтина не совсем стандартная. В ней реализуются много разных сценариев которые сложно увязать в один интерфейс. Поэтому и иду путём такого вот кукольного театра. Не хотелось плодить много Form со всеми необходимыми контролами. Мне бы это никак не упростило жизнь. У заказчика много противоречивых требований и как-то лаконично и красиво их увязать в одном интерфейсе та ещё задачка. Долгострой. Факультатив почти.


Не думали применить тот же шаблон "стратегия" и разработать некий обобщенный интерфейс, состоящий из 2-3х форм под него?
Ведь вы же по сути дела тратите свое время на работу дизайнера, вместо того чтобы тратить свои усилия на реализацию нормального варианта.

Я вот чую, что вы идете неверной дорогой.
Решать конечно вам, я лишь "рекомендую" взглянуть на возможность реализации под другим углом.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Единый AddHandler для всех Control-ов созданных динамически
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]