Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   VB 2011 Массивов элементов больше нет? (http://forum.oszone.net/showthread.php?t=221974)

TRAMPLE 01-12-2011 22:13 1807560

VB 2011 Массивов элементов больше нет?
 
Раньше писал на ВБ6, а сейчас познаю 2011, и вот обнаружил что теперь нельзя делать массив из элементов. Тоесть нельзя создать кучу текстбоксов с одним именем но разными индексами, но как теперь обрабатывать их в цыклах?

У меня допустим 30 текстбоксов, потом мне надо инфу с них переписать в масив данных
раньше это было типа такого

For a=0 to 29
mass(a)=text(a).text
next

Как теперь осуществляются такие задачи?

Delirium 02-12-2011 00:39 1807676

Код:

ArrayList mas = new ArrayList()
Foreach(TextBox tbx in this.Controls)
{
mas.Add(tbx.Text);
}


TRAMPLE 02-12-2011 20:07 1808187

Ок, спс. Будем пробовать

Хотя, еще не попробовав возникают вопросы.
1
Цитата:

Цитата Delirium
Foreach(TextBox tbx in this.Controls) »

что здесь означает tbx?
2 В какой последовательности будут обрабатывается текстбоксы
3 Я так понимаю этот код обрабатывает ВСЕ текст боксы на форме, а если мне нужны не все? Это нада помещать их в контейнер или как то так?

LilLoco 02-12-2011 22:09 1808273

Цитата:

Цитата TRAMPLE
что здесь означает tbx? »

Это "переменная содержащая текущий ТекстБокс цикла"...

Цитата:

Цитата TRAMPLE
а если мне нужны не все? »

Можно в цикле "отсеить", используя какой - либо "фильтр". Например, каждому текстбоксу в свойство Tag присвоить true если он нужен, и false - если нет.
Далее так:
ArrayList mas = new ArrayList()
Foreach(TextBox tbx in this.Controls)
{
if ((Boolean)tbx.Tag)
{
mas.Add(tbx.Text);
}
}

Delirium 03-12-2011 09:42 1808434

Цитата:

Цитата TRAMPLE
В какой последовательности будут обрабатывается текстбоксы »

А вот это неведомо :)
Цитата:

Цитата TRAMPLE
Это нада помещать их в контейнер или как то так? »

Если поместить их в одну Panel, то тогда надо написать
Код:

foreach(TextBox tbx in myPanel.Controls)
...


TRAMPLE 03-12-2011 15:01 1808528

Цитата:

Цитата Delirium
Цитата TRAMPLE:
В какой последовательности будут обрабатывается текстбоксы »
А вот это неведомо »

Плохо, ибо если в массив нужно помещать инфу с боксов в соответствующую ячейку...
Ну типа там Текстбоксы идут в стиле (Адрес, ФИО, телефон, год рождения и тд). И должны по порядку вписывается в массив.
Я думаю что они обрабатываются либо по мере их создания, либо по свойству TabIndex что было бы правильней, но увы не проверял пока.

Вообще когда я начал вспоминать былое, я не нашел каких то кардинальных отличий по сравнению с ВБ6, ну в том плане что в принципе всеми теми способами или так сказать "тактиками" которыми я писал проги в ВБ6 можно было использовать и здесь. Это первое с чем я столкнулся, и смотрю что поменялось многое. А вот то что элементам больше нельзя задавать индексы, это все таки плохо (

Delirium 03-12-2011 16:50 1808557

TRAMPLE, ты сам создаешь себе проблемы. Обработку данных в TextBox лучше все таки делать вручную, а не циклами. Да, это дольше, но это правильней. Несложно ведь создать массив и написать что то вроде такого:
string[10] mass;
1. При обработке ФИО -
mass[0] = tbxFio.Text;
2. телефон
mass[1] = tbxPhone.Text;

И этот код ненамного длиннее кода с циклом, но это дает тебе полный контроль над данными и индексами в массиве.

И встречный вопрос - а зачем вообще заносить это в массив?

LilLoco 03-12-2011 17:57 1808600

TRAMPLE, В конце концов храните "индексы" (цифры) в Tag для массива, и в цикле определяйте Tag и записывайте значение в индекс массива...

TRAMPLE 04-12-2011 01:55 1808859

Цитата:

Цитата Delirium
И встречный вопрос - а зачем вообще заносить это в массив? »

У меня вообще не телефоны и тд, у меня Год, месяц, день, час, минута, сикунда, долисикунда. И это все отсчитывается. Все данны вводятся в текстбокс (да это глупо, лучше сделать лейблы а для пользователя сделать отдельное окно запрос для ввода данных, но так нада, ибо пользователь должен иметь возможность в любое время остановит таймер и поменять значения) и после запуска они становятся не активны и идет отщет. Все данные с текстбоксов помещаются в массив, ну а дальше идет лесенка ифов (Т - это массив)

If T(2) > 0 Then
T(2) = T(2) - 1
ElseIf T(1) > 0 Then
T(1) = T(1) - 1
T(2) = 59
ElseIf T(0) > 0 Then
T(0) = T(0) - 1
T(1) = 59
T(2) = 59
Else
FuckEND()
End If

Ну это только для времени, а мне надо еще годе, месяц, день. Вот такой вот бздык.
Да, можно и без массива, но я ведь учусь )



Цитата:

Цитата LilLoco
В конце концов храните "индексы" (цифры) в Tag для массива, и в цикле определяйте Tag и записывайте значение в индекс массива... »

Я об этом думал, но ведь нельзя чтобы все текстбоксы были с одним именем, а ведь в цикле имя одинаковое, меняется только индекс.

У меня даже была крейзи идея, назвать все текстбоксы типа (Box1, Box2, Box3, Box4...)
И потом

name = "box"
For a=1 to 10
name=name & а
.
.
.
.
name= "box"
next a

Дума суть понятна, типа приставляем "индекс" к имени текстбокса, ну это бред помоему ))) И насколько я помню, в ВБ6 нельзя было так делать, потому что нельзя чтобы переменная содержала имя элемента, в данном случае name.text не распознает. Тут как я понимаю можно, указав что это контрол и тд, но все равно бред... не грамотно все это (

LilLoco 04-12-2011 10:38 1808929

TRAMPLE, Я не предлагаю индексы хранить в имени TextBox`а . Почитайте повнимательнее. У каждого элемента, есть свойство Tag, в котором можно хранить все что душе угодно... Я и предлагал им воспользоваться...

TRAMPLE 04-12-2011 11:47 1808955

Цитата:

Цитата LilLoco
Я не предлагаю индексы хранить в имени TextBox`а . Почитайте повнимательнее. У каждого элемента, есть свойство Tag, в котором можно хранить все что душе угодно... Я и предлагал им воспользоваться... »

Что касается вашего предложения, я тоже об этом не говорил. Я сказал о том что нельзя сделать одинаковые имена, то есть чтобы различие между двумя текстбоксами было только в свойстве Tag. Сделать "по старому" всеравно не получится.


В принципе проблема решена. Можно сказать что её как таковое и не было. Есть пути по которым можно решить данную задачу, но тем не мение, идею убрать возможность индексировать элементы считаю плохой. Если у нас программа это некий бланк, где есть множество текстбоксов, и потом данные с них нужно заносить в массив, то лучше способа чем
For a=0 to 29
mass(a)=text(a).text
next
по моему нету. Я просто думал что может сейчас это осуществляется как то по другом, но есть только альтернативы (

Verholom 13-12-2011 12:52 1814296

Их нету еще с первой версии дотнета

Delirium 15-12-2011 01:01 1815476

Verholom, кого нет, массивов? С чего бы ради. У каждого контейнера есть интерфейс IEnumerable, который как раз и представляет собой массив тех или иных элементов. И именно наличие IEnumerable позволяет работать циклу foreach.

Verholom 17-12-2011 20:58 1817021

массивов элементов управления на формах! :read: :drug:


Время: 02:37.

Время: 02:37.
© OSzone.net 2001-