Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Создание объектов


Автор: YoD 30.11.2004, 20:30
Люди, подскажите пожалуйста. Мне надо на форме создать нечто вроде таблицы из image boxes. Вроде всё просто, но в VB. NET убрали мою любимую возможность - создание массивов элементов управления. Кто знает, как программно создать много image boxes на фореме (много это порядка 100) и как ими потом управлять. Буду очень благодарен за все советы

Автор: -Mikle- 1.12.2004, 01:11
Цитата(YoD @ 1.12.2004, 00:30)
Вроде всё просто, но в VB. NET убрали мою любимую возможность - создание массивов элементов управления

Не убрали, а скорее усовершенствовали smile Просто в новой архитектуре использовать некое "загадочное" свойство Index у контролов, перестало быть необходимым. Теперь все контролы создаются програмно, в коде, а не где-то там за кулисами... smile И ф-ии для обработки событий назначаются тоже теперь програмно...
Короче вот код на примере массива PictureBox'ов. Ниже написанное засовываем в класс формы.

Код

   'Объявим массив типа PictureBox
   Dim pics() As System.Windows.Forms.PictureBox

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim i As Integer
       'добавим Пять контролов
       For i = 0 To 4
           ReDim Preserve pics(i)
           pics(i) = New System.Windows.Forms.PictureBox()
           With pics(i)
               'Задаем каждому следующему PictureBox, разную Х координату (i*150)
               .Location = New System.Drawing.Point(i * 150, 0)
               'Задаем цвет
               .BackColor = System.Drawing.Color.AliceBlue

               'Здесь пишем любую инициализацию экземпляров PictureBox

           End With
           'Далее задаем функции для событий
           'MouseEnter, MouseLeave и Click соответственно
           AddHandler pics(i).MouseEnter, AddressOf picMEnter
           AddHandler pics(i).MouseLeave, AddressOf picMLeave
           AddHandler pics(i).Click, AddressOf picClick
       Next i
       'Добавляем весь массив в коллекцию контролов формы
       Me.Controls.AddRange(Me.pics)
       Me.ResumeLayout()
   End Sub



   Private Sub picMEnter(ByVal sender As System.Object, ByVal e As System.EventArgs)
       sender.BorderStyle = BorderStyle.Fixed3D
   End Sub

   Private Sub picMLeave(ByVal sender As System.Object, ByVal e As System.EventArgs)
       sender.BorderStyle = BorderStyle.None
   End Sub

   Private Sub picClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
       Dim i As Integer
       'Если надо узнать именно индекс в массиве,
       'то ищем объект sender
       i = pics.IndexOf(pics, sender)
       MsgBox("   Кликнули по " & i & " PictureBox'у   ")
   End Sub


Пробуй, будут вопросы по этой теме, пиши сюда. Вопросы по другой теме, просьба создавать в новом топике.

Автор: Гость_Папа 12.11.2005, 15:17
-Mikle-

Приветствую.
Вопрос новичка по выше приведенному коду.
Поясни что означает или что происходит в результате выполнения этой строки
ReDim Preserve pics(i)

Заранее спасибо.

Автор: Exception 12.11.2005, 15:57
она увеличивает количество элементов массиве.

Автор: Гость_Папа 13.11.2005, 00:42
Run-time error
Спасибо.
Но я не совсем понял смысл.

Я бы выполнил это так ( пример размещения на форме 40 label )
Код

Private Sub mnuStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuStart.Click
       
        Dim count As Int16 = 1
        Dim lab As Label
        For r As Int16 = 1 To 5   ' пять рядов
            For k As Int16 = 1 To 8 ' восемь в ряд поэтому люс в люсе
                lab = New Label
                lab.Name = "lab" & count
                lab.BorderStyle = BorderStyle.Fixed3D
                lab.Width = 20
                lab.Height = 20
                lab.Location = New Point(k * 30, r * 30)
                lab.ImageList = ImageList1
                lab.ImageIndex = Tindex(count) '
                lab.Tag = Tindex(count)
                lab.Visible = True
                AddHandler lab.Click, AddressOf GekliktNog
                Me.Controls.Add(lab) ' эта команда помещает созданные програмно label  на форму.
                count += 1
            Next
        Next

    End Sub



Впрочем Mikle это и так написал. Только в чем фишка AddRange вместо Add просто?

Если можно то вопрос по обработчику событий Click.
Как сделать:
кликнули по первому контролу он стал невидимым Visible = Fals, кликнули по второму он тоже стал невидимым, а потом если кликнуть по третьему (или через промежуток времени) то первый опять становится видимым.
Есть возможность через IndexOf определить индекс контрола и потом с его помощью управлять контролом дальше.
Но у меня что-то не получается. И потом никак не могу придумать как отследить первый и второй клик. Ведь когда кликнули по второму контролу клик номер два, но после клика по третьему клик номер два должен стать кликом номер один, а новый(третий) номером два. Плюс должен сохраняться индекс контрола, чтобы потом его сделать видимым.

Run-time error
Был бы очень признателен за помощь.
Я тут уже несколько дней мучаюсь. По идее при каждом клике должен быть разный индекс контрола. А у меня почемуто часто выскакивает один и тот же. Использую это выражение для определения индекса контрола по которому кликнули: nrT = Me.Controls.IndexOf(sender)

ЗЫ модератор простите, если что нарушил.

Всего доброго. smile

Автор: thicking 6.4.2009, 20:53
Это все хорошо, но я столкнулся с такой проблемой.  У меня на форме имеется Controlbox, в котором находятся35 textbox'ов. Мне нужно при загрузке формы, чтобы все textbox'ы были недоступны, а при нажатии на кнопку (назовем ее "редактировать") они разблокировались.  Делал как написано во 2 посте и постоянно получаю пустой массив. Если убрать маску и взять все элементы на форме, то видно что контролы находящиеся внутри   Controlbox'а просто игнорируются. Пробовал экспериментировать с Controlbox, но результатов не получил. Очень надеюсь на вашу помощь.

Автор: Rififi 6.4.2009, 22:26
создай сначала Panel (программно или в дизайне), а уже к ней цепляй свои textbox'ы
для блокирования/разблокирования
this.panel1.Enabled = true; // или false
ps. что в коде не смотрел (не люблю vb (: ) поэтому ответил как понял вопрос.

Автор: thicking 6.4.2009, 22:55
т.е. в Controlbox вставляю панель, а в панель все остальное... Я правильно понял? 

Автор: -Mikle- 7.4.2009, 08:04
Цитата(thicking @  6.4.2009,  23:53 Найти цитируемый пост)
У меня на форме имеется Controlbox

Что такое Controlbox? Это панель? или контейнер? Такого компонента нет в VB...

Автор: thicking 7.4.2009, 08:58
Цитата(-Mikle- @  7.4.2009,  06:04 Найти цитируемый пост)
Что такое Controlbox? Это панель? или контейнер? Такого компонента нет в VB... 


Признаю, мой косяк. Не ControlBox,  а TabControl

Автор: -Mikle- 7.4.2009, 10:01
Да, тогда так:
Цитата(thicking @  7.4.2009,  01:55 Найти цитируемый пост)
вставляю панель, а в панель все остальное... 


Если ты потом у панели выставишь свойство Enabled = False, то все расположенные на нем контролы станут неактивными.

Автор: thicking 7.4.2009, 10:51
Так и сделаю, но вопрос все равно остается открытым, так как потом еще все это нужно будет заполнить данными, а тупо  описывать каждый textbox с новой строчки очень не удобно

Автор: thicking 7.4.2009, 13:29
Сделал примерно так:
Код

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim container As Control = TabControl1.TabPages(0)
        Dim ctrl As Control
        Dim ctrl_arr(1) As Integer
        Dim i As Integer
        i = 0
        For Each ctrl In container.Controls
            If TypeOf (ctrl) Is TextBox Then
                ctrl_arr(i) = container.Controls.IndexOf(ctrl)
                i = i + 1
                ReDim Preserve ctrl_arr(i)
            End If
        Next

        For i = 0 To UBound(ctrl_arr) - 1
            container.Controls(ctrl_arr(i)).Text = i
        Next



    End Sub

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)