Страница: 1 |
Страница: 1 |
Вопрос: Как создавать массивы элементов управления вVb2005
Добавлено: 17.07.06 12:53
Автор вопроса: Natasha
Добрый день! Подскажите, пожалуйста, новенькой, как в МИ2005 создавать массивы элементов управления? В VB6 это получалось простым копированием элемента (он сам предлагал создать массив), а в 2005-м ничего не выходит. Какие есть простые способы? Заранее спасибо.
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 17.07.06 13:07
В .NET нет как такового, привычного для вас понятия массив элементов управления. Для этих целей используют AddHandler
Номер ответа: 2
Автор ответа:
Natasha
Вопросов: 1
Ответов: 1
Профиль | | #2
Добавлено: 17.07.06 13:19
Расскажите, пожалуйста поподробнее, как его использовать?
Номер ответа: 3
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #3
Добавлено: 17.07.06 15:14
В соответствии с MSDN.
Номер ответа: 4
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #4
Добавлено: 17.07.06 19:43
В .NET есть поддержка массивов элементов управления, но только лишь с целью поддержки VB6. Чтобы несколько элементов управления вызывали одно и тоже событие, надо дополнить список Handles, который находится в описании обработчика события. Например, так:
Private Sub Button1_Click(ByVal Sender As System.Object, ByVal EventArgs As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
'// ...
End Sub
Либо так, как описал EROS:
Private Sub frmMain_Click(ByVal Sender As System.Object, ByVal EventArgs As System.EventArgs) Handles MyBase.Click
AddHandler Button1.Click, AddressOf EventHandler
End Sub
Private Sub EventHandler(ByVal Sender As System.Object, ByVal EventArgs As System.EventArgs)
'//
End Sub
Номер ответа: 5
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #5
Добавлено: 17.07.06 20:28
AddHandler Button1.Click, AddressOf EventHandler
Это, по сути, одно и то же.. разница лишь в синтаксисе, и кому как удобней писать ))
Главное - это повесить события от разных контролов на 1 обработчик.. как правило имеено для этого и использовались массивы элементов в 6-ке..
Номер ответа: 6
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #6
Добавлено: 17.07.06 21:30
Просто юзая AddHandler, мона добавлять/удалять обработчики динамически.
Номер ответа: 7
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #7
Добавлено: 17.07.06 21:37
да и вариант, предложенный в MSDN, мне чего-то не очень нравится...
Private Sub Text1_Change(Index As Integer)
Select Case Index
Case 0: MsgBox("The text in the first TextBox has changed"
Case 1: MsgBox("The text in the second TextBox has changed"
Case 2: MsgBox("The text in the third TextBox has changed"
End Select
End Sub
'// Visual Basic 2005
Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
TextBox1.TextChanged, TextBox2.TextChanged, TextBox3.TextChanged
Select Case DirectCast(sender, TextBox).Name
Case TextBox1.Name : MsgBox("The text in the first TextBox has changed"
Case TextBox2.Name : MsgBox("The text in the second TextBox has changed"
Case TextBox3.Name : MsgBox("The text in the third TextBox has changed"
End Select
End Sub
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 18.07.06 01:18
Тут все очень просто.. ща объясню...
вот смотри.. в VB6 через индексы массива ты получал ссылку на контрол, так??? А тут эта ссылка передается в параметре sender. Единственное, что тебе надо сделать,так это привести sender к нужному типу...
По аналогии с твоим примером из MSDN..
В результате этого в MyTextBox будет ссылка на тот контрол, который отправил это событие! (то же самое что и в VB6.. только без индексов)
А что касается идентификации, то тут уже кому как нравится.. кто проверяет Name контрола( как в примере), лично я в таких случаях создаю Enum и значение загоняю в свойство Tag контрола. Это уже не суть важно.. главное, что у тебя на руках ссылка на контрол, а там уже делай с ней что угодно!!!
З.Ы. DirectCast(sender, TextBox).Name - это тоже самое что и CType(sender, TextBox).Name! Сначала приводят к типу, а потом проверяют значение Name...
Номер ответа: 9
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #9
Добавлено: 18.07.06 11:52
2 EROS: тьфу, ступил... Я знал, для чего Sender, и как определить контрол, вызвавший событие... Просто, наверное, непривычно ещё проверять не индекс, а имя контрола...
Номер ответа: 10
Автор ответа:
K&M
ICQ: 225442067
Вопросов: 20
Ответов: 170
Профиль | | #10
Добавлено: 25.07.06 13:39
Вероятно для идентификации лучше создать унаследованый класс и добавить ему необходимые переменные.
Номер ответа: 11
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #11
Добавлено: 26.07.06 02:38
имхо.. это лишнее.. лично я обхожусь свойством Tag.. нумерую нужные мне элементы и потом сраниваю с Enum ...
Номер ответа: 12
Автор ответа:
AlexNet
Вопросов: 0
Ответов: 4
Профиль | | #12
Добавлено: 22.12.06 16:21
Подскажите, пожалуйста, как програмно создать N-ое кол-во элементов управления?
Номер ответа: 13
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #13
Добавлено: 22.12.06 16:40
Dim Textbox As New TextBox
TextBox.Visible = True
TextBox.Size = New Size(100, 20)
TextBox.Location = New Point(10, 30*i)
Me.Controls.Add TextBox
Next
Пишу по памяти, мог где-то чуть ошибиться. Но в целом идея такая.
Номер ответа: 14
Автор ответа:
AlexNet
Вопросов: 0
Ответов: 4
Профиль | | #14
Добавлено: 22.12.06 16:59
Отлично! Спасибо!