Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Индексированные контроллы в Vb.Net / 25 сообщений из 46, страница 1 из 2
15.04.2015, 09:07
    #38936731
Slava_Psk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
В VB6 имеется возможность создания индексированных контролов, например Label1(i), что очень удобно. В Vb.Net я делаю это так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 
    Dim LabelArray1(30) As Label
    Dim LabelArray2(30) As Label
    Dim TextArray(30) As TextBox
    Dim TextArray1(30) As TextBox
    Dim TextArray2(30) As TextBox
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Close()
    End Sub
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Label2.Text = ""
        TextBox1.Text = ""
        LabelArray(1) = Label3
        LabelArray(2) = Label4
        ..........
       End Sub



Что не очень удобно и красиво. Есть ли другие варианты?
...
Рейтинг: 0 / 0
15.04.2015, 09:15
    #38936744
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Slava_PskВ VB6 ...... например Label1(i), что очень удобнодостаточно неудобно, но это - единственный способ использовать обработчик событий на заранее неизвестном количестве стандартных контролов, то бишь заплатка, покрывающая отсутствие возможности динамически вешать события.

В .NET этого нет из-за того, что такая возможность есть. Так что надо просто сменить подход к задаче, не ориентируясь на костыль VB6
...
Рейтинг: 0 / 0
15.04.2015, 09:31
    #38936767
Slava_Psk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Shocker.Pro, не могли бы дать пример или наводку?
...
Рейтинг: 0 / 0
15.04.2015, 10:25
    #38936823
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Shocker.Pro,

Костыль не костыль,
но мне из за этого приходится много переписывать, а некоторые коды тупо размножать (потому что это местами проще и понятнее).
А на некоторые общие ф-ции дописывать куски, определяющие "индекс", которые больше самого собственно кода который по делу.
Вешать по куче хандлов на одну ф-цию, а потом мудохаться с CType(sender, Control) далеко не всегда удобно.
Вот если б было оба варианта, было бы хорошо.
Я так скажу, у каждого способа свои преимущества и свои недостатки.
...
Рейтинг: 0 / 0
15.04.2015, 10:39
    #38936840
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Вот чего хорошо в .Net так это то что в VB6 нельзя сделать более 256 контролов на форме.
И индексы (в ущерб удобности) хоть немного эту ситуацию разруливали,
хотя меня в одном из проектов последнее время это уже плохо спасало.
В .Net по крайней мере такого ограничения нет, рисуй себе Label1 - Label10000 в удовольствие, при этом только надо не забыть (если нужно событие) 10000 раз через запятую написать Handles1... Handles10000. "Удобство" налицо.
...
Рейтинг: 0 / 0
15.04.2015, 10:52
    #38936849
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Дмитрий77Вот чего хорошо в .Net так это то что в VB6 нельзя сделать более 256 контролов на форме.
И индексы (в ущерб удобности) хоть немного эту ситуацию разруливали,
хотя меня в одном из проектов последнее время это уже плохо спасало.
В .Net по крайней мере такого ограничения нет, рисуй себе Label1 - Label10000 в удовольствие, при этом только надо не забыть (если нужно событие) 10000 раз через запятую написать Handles1... Handles10000. "Удобство" налицо.Элементарный LINQ-запрос к Control.Controls Property поможет.
...
Рейтинг: 0 / 0
15.04.2015, 10:57
    #38936854
Slava_Psk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Дмитрий77, не очень понимаю, как это делается. Вы не могли бы маленький примерчик?
...
Рейтинг: 0 / 0
15.04.2015, 11:23
    #38936887
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Slava_Psk,

Делается что? Событие на 10000 кнопок вешается?
Код: vbnet
1.
2.
3.
    Private Sub ButtonAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, ... Button10000.Click
      CType(sender, Button).Visible = False
    End Sub
...
Рейтинг: 0 / 0
15.04.2015, 13:38
    #38937117
Slava_Psk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Большое спасибо всем. Меня устроит такой вариант:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
  Dim LabelArray(30) As Button
    Dim i As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Me.i = 1 To 2
            AddButtons()
        Next
    End Sub
    Private Sub AddButtons()
        ' Suspend the form layout and add two buttons.
        Me.SuspendLayout()
        Dim button As New Button()
        button.Location = New Point(10 + (i - 1) * 300, 10)
        button.Size = New Size(75, 25)
        button.Text = "OK" & Str(i)
        Me.Controls.AddRange(New Control() {button})
        Me.ResumeLayout()
        LabelArray(i) = button
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        LabelArray(1).Text = "Кнопка1"
        LabelArray(2).Text = "Кнопка2"
    End Sub
...
Рейтинг: 0 / 0
15.04.2015, 14:22
    #38937194
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Shocker.Proно это - единственный способ использовать обработчик событий на заранее неизвестном количестве стандартных контроловВоловиц, ты ацтой :) (с)

Код: 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.
Form1:

Dim mButtons As New Collection

Private Sub Form_Load()
Dim cmd As CommandButton, btn As clsButton
    Set cmd = Me.Controls.Add("VB.CommandButton", "cmd1")
    cmd.Visible = True
    Set btn = New clsButton
    Set btn.Button = cmd
    mButtons.Add btn
End Sub

Public Sub ButtonClick(Button As CommandButton)
    MsgBox Button.Name
End Sub

clsButton:

Dim WithEvents mButton As CommandButton

Public Property Set Button(value As CommandButton)
    Set mButton = value
End Property

Private Sub mButton_Click()
    Dim frm As Form1
    Set frm = mButton.Parent
    frm.ButtonClick mButton
End Sub
...
Рейтинг: 0 / 0
15.04.2015, 14:42
    #38937230
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Дмитрий77Slava_Psk,

Делается что? Событие на 10000 кнопок вешается?
Код: vbnet
1.
2.
3.
    Private Sub ButtonAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, ... Button10000.Click
      CType(sender, Button).Visible = False
    End Sub

ты тоже :)

Код: vbnet
1.
2.
3.
4.
For x = 1 To 1000
   Dim cmd As Button = Controls.Add(...)
   AddHandler cmd.Click, AddressOf ButtonAll_Click
Next


или вообще так:

Код: vbnet
1.
2.
3.
        AddHandler cmd.Click, Sub(sender As Object, e As EventArgs)
                                  CType(sender, Button).Visible = False
                              End Sub
...
Рейтинг: 0 / 0
15.04.2015, 15:00
    #38937254
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
AntonariyShocker.Proно это - единственный способ использовать обработчик событий на заранее неизвестном количестве стандартных контроловВоловиц, ты ацтой :) (с)изящно

я делал немного иначе - обертывал в свой юзерконтрол (все равно нужна была дополнительная функциональность)
...
Рейтинг: 0 / 0
15.04.2015, 15:10
    #38937269
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Дмитрий77Вот чего хорошо в .Net так это то что в VB6 нельзя сделать более 256 контролов на форме.
И индексы (в ущерб удобности) хоть немного эту ситуацию разруливали,
хотя меня в одном из проектов последнее время это уже плохо спасало.
В .Net по крайней мере такого ограничения нет, рисуй себе Label1 - Label10000 в удовольствие, при этом только надо не забыть (если нужно событие) 10000 раз через запятую написать Handles1... Handles10000. "Удобство" налицо.

Не напоролись еще? - нельзя в винформах сделать 10000 контролов.

Ограничение системы - дает (в зависимости от мощности машины) - 1600 - 2500 хендлов.
Потом эксепшен.

Ну и так делать нельзя. контролы - они для человека, чтобы видел, нажимал.
То есть - надо разделять отображение и данные.
...
Рейтинг: 0 / 0
15.04.2015, 15:26
    #38937296
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
D129,

У меня в форме настроек где-то 35 узлов дерева, каждому узлу соответствует вкладка - ну сколько со всеми рамками 10-20-30 вряд ли больше.
В VB6 я балансировал на грани, при этом использовались массивы Label, TextBox и т.п. - причем Text(1) и Text(2) например могли быть абсолютно разного смысла.
В .Net воспроизвел тоже самое, контролов думаю стало еще больше (не отказывал себе в панелях и прочем для простоты конфигурирования расположения и т.п.). Ну, нет, пока не напоролся.
...
Рейтинг: 0 / 0
15.04.2015, 15:33
    #38937308
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
я в таких случаях оформлял вкладки как юзерконтролы и подгружал их динамически на форму при выборе из дерева
...
Рейтинг: 0 / 0
15.04.2015, 15:39
    #38937318
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Дмитрий77 35 узлов дерева

Не имеет смысла создавать и хранить то, что в данный момент невидимо (может пользователь и не будет это открывать).
Надо делать типа окно просмотра - и создавать контролы в момент обращения.
На винформах это можно делать с помощью рефлексии.

А как раз на WPF это более естественно организуется - хотя и не элементарно (потому, что это и не есть элементарно).
Когда задаются стили и шаблоны элементов коллекции - а сами стили и шаблоны выбираются в зависимости от типа данных.
И в одном списке может быть разная визуализация для разных классов. И тут уже привязки (binding) - наше всё...
...
Рейтинг: 0 / 0
15.04.2015, 15:39
    #38937320
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Shocker.ProAntonariyпропущено...
Воловиц, ты ацтой :) (с)изящно

я делал немного иначе - обертывал в свой юзерконтрол (все равно нужна была дополнительная функциональность)из изящного тут только
Код: vbnet
1.
2.
Set frm = mButton.Parent
frm.ButtonClick mButton

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

а обычно для этого используется класс-коллекция, которая имеет собственное событие ButtonClick, на которое подписывается форма, эта коллекция передается в clsButton, и кнопка дергает ее метод. а еще можно вместо событий использовать интерфейсы.
...
Рейтинг: 0 / 0
15.04.2015, 15:39
    #38937321
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Shocker.Proя в таких случаях оформлял вкладки как юзерконтролы и подгружал их динамически на форму при выборе из дерева

:-)
...
Рейтинг: 0 / 0
15.04.2015, 16:37
    #38937448
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Какая разница, юзерконтролы, вкладки, подгружать не подгружать.
Когда делал впервые, не было Treview, на одной плоской форме все в 3-х рамках помещалось.
Потом дерево с 5-ю узлами появилось.
Не глючит, работает, не тормозит, смотрится хорошо, бабло капает. Че еще надо.

Вопрос был про массивы контролов.
Ответ: в .Net так нельзя.
Для 3-х однотипных ListView удобнее индекс нежели 3 разных ника. Мое мнение такое.
...
Рейтинг: 0 / 0
15.04.2015, 17:21
    #38937510
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Antonariyа обычно для этого используется класс-коллекция, которая имеет собственное событие ButtonClick, на которое подписывается форма, эта коллекция передается в clsButton, и кнопка дергает ее метод. а еще можно вместо событий использовать интерфейсы.само собой, у меня есть коллектор событий, я про идею коллекции классов-оберток
...
Рейтинг: 0 / 0
15.04.2015, 17:23
    #38937513
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
D129Shocker.Proя в таких случаях оформлял вкладки как юзерконтролы и подгружал их динамически на форму при выборе из дерева
:-)а что, собственно, в этом смешного? )


Дмитрий77Какая разница, юзерконтролы, вкладки, подгружать не подгружать.разница как раз в ограничениях на количество контролов
...
Рейтинг: 0 / 0
15.04.2015, 18:28
    #38937613
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Дмитрий77Какая разница, юзерконтролы, вкладки, подгружать не подгружать.
Когда делал впервые, не было Treview, на одной плоской форме все в 3-х рамках помещалось.
Потом дерево с 5-ю узлами появилось.
Не глючит, работает, не тормозит, смотрится хорошо, бабло капает. Че еще надо.

Вопрос был про массивы контролов.
Ответ: в .Net так нельзя.
Для 3-х однотипных ListView удобнее индекс нежели 3 разных ника. Мое мнение такое.
Есть разница.
Я чинил проэкт, который рожал вкладку в таб контроле для каждой строки в базе и заполнял там все текстбоксы (штук 15-20) данными. Пока строк в базе (при тестировании) было 10-20 - все работало.
Когда дали на продакшен - а там "аж" 400 строк - обвалилось.
...
Рейтинг: 0 / 0
15.04.2015, 18:29
    #38937615
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Shocker.Proа что, собственно, в этом смешного?

а, я неправильно выразился - думал поставить +1.
...
Рейтинг: 0 / 0
15.04.2015, 18:32
    #38937617
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
Дмитрий77Для 3-х однотипных ListView удобнее индекс нежели 3 разных ника. Мое мнение такое.
Для подобных извращений есть атрибуты.
Пометьте атрибутом с конструктором, в котором давайте контролам индекс. Раз уж вам так надо....
...
Рейтинг: 0 / 0
15.04.2015, 18:49
    #38937630
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индексированные контроллы в Vb.Net
D129,
Что интересно, мне как раз ничего не надо и все более менее устраивает. И не я топик создавал.😏
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Индексированные контроллы в Vb.Net / 25 сообщений из 46, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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