События массива элементов управления TextBox

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

События массива элементов управления TextBox

Сообщение AlekseyVB » 07.07.2009 (Вт) 20:31

Создал массив элементов управления TextBox.

Код: Выделить всё
Dim arrTextBoxIncome(24) As TextBox
arrTextBoxIncome(1) = TextBox1 : arrTextBoxIncome(2) = TextBox2 : ..............


Мне нужно что бы работало что-то вроде события LostFocus для всех элементов массива. Например, что бы пересчитывалась сумма всех полей при каждом событии LostFocus. В ВБ6 это можно было легко реализовать. Как реализовать это в .Net?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: События массива элементов управления TextBox

Сообщение MIT » 07.07.2009 (Вт) 21:29

Код: Выделить всё
public sub MyLostFocus(sender as object,e as object)
magbox (sender.tag)
end sub
Dim arrTextBoxIncome(24) As TextBox
arrTextBoxIncome(0) = TextBox1 : arrTextBoxIncome(0).tag = 0 : addhandler arrTextBoxIncome(0).lostfocus, addressof MyLostFocus
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

AlekseyVB
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 10.04.2009 (Пт) 18:47

Re: События массива элементов управления TextBox

Сообщение AlekseyVB » 08.07.2009 (Ср) 15:47

Спасибо, всё работает. Только приходится писать строку:
Код: Выделить всё
arrTextBoxIncome(1) = TextBox1 : arrTextBoxIncome(1).Tag = 1 : AddHandler arrTextBoxIncome(1).LostFocus, AddressOf subLostFocus

столько раз сколько количество элементов управления в массиве. Можно ли как-то сократить количество строк? :)

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: События массива элементов управления TextBox

Сообщение MIT » 08.07.2009 (Ср) 15:52

Можно попробовать засунуть все в 3 строчки.
Но для этого необходимо, что бы текстбоксы находились в одном контейнере (например все на форме) и имели что-то схожее в именах (или как вариант - что бы помимо нужных в контейнере не было других текстбоксов). Просто перебор коллекции Controls с отсеивающим условием - тип контрола (только текстбокс) и шаблоном имени (StartWith, например).
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: События массива элементов управления TextBox

Сообщение Alec » 08.07.2009 (Ср) 21:03

Дык массив уже есть:
AlekseyVB писал(а):Создал массив элементов управления TextBox.

По нему и перебирать
Иногда лучше вовремя остановиться...
И начать заново!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: События массива элементов управления TextBox

Сообщение MIT » 08.07.2009 (Ср) 21:49

Заметь, что массив-то массивом, но он пустой и его надо заполнить:
Код: Выделить всё
arrTextBoxIncome(0) = TextBox1
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: События массива элементов управления TextBox

Сообщение Alec » 08.07.2009 (Ср) 22:04

Цитирую целиком:
AlekseyVB писал(а):Создал массив элементов управления TextBox.

Код: Выделить всё
Dim arrTextBoxIncome(24) As TextBox
arrTextBoxIncome(1) = TextBox1 : arrTextBoxIncome(2) = TextBox2 : ..............


Т.е. часть задачи, а именно заполнение массива, решена
Иногда лучше вовремя остановиться...
И начать заново!

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: События массива элементов управления TextBox

Сообщение Alec » 08.07.2009 (Ср) 22:07

To AlekseyVB:
А не проще ли создавать TextBox'ы при заполнении массива? Предполагаю они располагаются как-то упорядоченно?
Иногда лучше вовремя остановиться...
И начать заново!

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: События массива элементов управления TextBox

Сообщение Денис » 09.07.2009 (Чт) 7:43

Правильное .NET-решение это создавать элементы управления кодом и помещать их на форме в тех местах, где они должны стоять.
Автор же сначала кидает контролы на форму в дизайнере, а потом еще в коде дурную работу делает.
AlekseyVB, только без обид:
"Бешенной собаке и сто вёрст не крюк."

__________________
Зацените код (на форму ничего кидать не нужно!!):
Код: Выделить всё
Public Class Form1

    Private txtArray(5) As TextBox

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim i As Integer

        For i = 0 To 5
            txtArray(i) = New TextBox
            With txtArray(i)
                .Parent = Me
                .Left = 10
                .Top = (.Height + 4) * i
                .Tag = i
                AddHandler .GotFocus, AddressOf MyGotFocus
            End With
        Next
    End Sub

    Private Sub MyGotFocus(ByVal Sender As System.Object, ByVal e As System.EventArgs)

        Dim i As Integer

        For i = 0 To 5
            txtArray(i).BackColor = Color.White
        Next

        txtArray(Sender.Tag).BackColor = Color.LightGray

    End Sub

End Class

Если вместо 5 проставить 50 то тот же код сделает 50 текстбоксов.

_________________
Иногда свойство Tag необходимо в работе, тогда сделаем полную эмуляцию массива контролов как в vb6.
Создадим новый класс, унаследуем его от TextBox, и пропишем в нем публичную переменную Index. Модифицированный код будет выглядеть так:
Код: Выделить всё
Public Class Form1

    Private txtArray(5) As IdxTextBox

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim i As Integer

        For i = 0 To 5
            txtArray(i) = New IdxTextBox
            With txtArray(i)
                .Parent = Me
                .Left = 10
                .Top = (.Height + 4) * i
                .Index = i
                AddHandler .GotFocus, AddressOf MyGotFocus
            End With
        Next

    End Sub

    Private Sub MyGotFocus(ByVal Sender As System.Object, ByVal e As System.EventArgs)

        Dim i As Integer

        For i = 0 To 5
            txtArray(i).BackColor = Color.White
        Next

        txtArray(Sender.Index).BackColor = Color.LightGray

    End Sub

End Class

'------------------------------------------
'Вот он новый класс:
'------------------------------------------

Public Class IdxTextBox
    Inherits TextBox

    Public Index As Integer

End Class
Последний раз редактировалось Денис 10.07.2009 (Пт) 7:43, всего редактировалось 2 раз(а).
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: События массива элементов управления TextBox

Сообщение Nord777 » 09.07.2009 (Чт) 16:13

Денис, а для каких целей ты использовал класс IdxTextBox ?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: События массива элементов управления TextBox

Сообщение Денис » 09.07.2009 (Чт) 16:17

Nord777 писал(а):Денис, а для каких целей ты использовал класс IdxTextBox ?

Невнимательно читаешь:
Иногда свойство Tag необходимо в работе, тогда сделаем полную эмуляцию массива контролов как в vb6.
Создадим новый класс, унаследуем его от TextBox, и пропишем в нем публичную переменную Index. Модифицированный код будет выглядеть так:


И да, я там правил код, сейчас поправил. Первая портянка со словом Index не работала бы я вернул туда Tag.
Последний раз редактировалось Денис 09.07.2009 (Чт) 16:21, всего редактировалось 1 раз.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: События массива элементов управления TextBox

Сообщение Nord777 » 09.07.2009 (Чт) 16:20

Хорошо, тогда поверну по-другому: какова надобность в переменной index ?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: События массива элементов управления TextBox

Сообщение Денис » 09.07.2009 (Чт) 16:23

Для удобства. И чтобы Tag использовать для других нужд.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: События массива элементов управления TextBox

Сообщение Nord777 » 09.07.2009 (Чт) 16:28

Я почему спрашиваю... я думал есть какой-то сакральный смысл...
Судя по всему нет, поэтому:
DirectCast( Sender, TextBox ).BackColor = ....
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 81

    TopList  
cron