Обратиться к элементу, зная его имя

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

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

Calhoon
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 07.10.2007 (Вс) 18:01
Откуда: Новосибирск

Обратиться к элементу, зная его имя

Сообщение Calhoon » 19.09.2009 (Сб) 19:00

Есть ли возможность обратиться к элементу (контролу формы) в подпрограмме, если ей в качестве параметра передать имя контрола as String?
Самое простое решение вывести на экран 15 простых чисел:
Print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47"
____________________________
VS2008 & VS2010
VB6

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Обратиться к элементу, зная его имя

Сообщение Williams » 19.09.2009 (Сб) 19:04

Без заморочек, как мне кажется, не выйдет.
И вы думаете, что вас оставят в живых после прочтения этого поста?

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

Re: Обратиться к элементу, зная его имя

Сообщение Nord777 » 19.09.2009 (Сб) 19:28

Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Обратиться к элементу, зная его имя

Сообщение Dmitry81 » 19.09.2009 (Сб) 19:51

Легко:
Код: Выделить всё
Me.Controls.Item("Label1").Text = "......"

на форме подразумевается наличие Label1. Ну и, естественно - на форме. Т.е. форма - контейнер для данного контрола. иначе обращаемся к контейнеру по иерархии, например так:
Код: Выделить всё
Me.Controls.Item("GroupBox1").Controls.Item("Label1").Text = "......"

Ну можно еще устроить поиск контрола по имени и потом обращаться к нему после нахождения. Поиск контрола - см. соседнюю тему о получении списка контролов.
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

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

Re: Обратиться к элементу, зная его имя

Сообщение MIT » 19.09.2009 (Сб) 22:13

Кладем кнопку с именем Button1 и:
Код: Выделить всё
DirectCast(Me.GetType.GetField("_"c & "Button1", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(Me), Control).Text = "my text 1"
Префикс "_" для контролов обязателен, при условии что созданы они дизайнером, а не руками. Работает с конролами где бы они не лежали визуально.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Calhoon
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 07.10.2007 (Вс) 18:01
Откуда: Новосибирск

Re: Обратиться к элементу, зная его имя

Сообщение Calhoon » 25.09.2009 (Пт) 8:30

Спасибо. DirectCast, конечно, работает, но вот при попытке обратиться к меню, вылетает ошибка
Не удалось привести тип объекта "System.Windows.Forms.ToolStripMenuItem" к типу "System.Windows.Forms.Control"

Меню не является контролом? Тогда какой тип для него указатькак второй параметр DirectCast? ToolStripMenuItem? Из-за этого пропадает универсальность кода - вполне возможно, что найдется еще какой такой "особый" элемент, к которому спокойно можно обратиться в виде Форма.Имя, а при неизвестном заранее имени приходится вот так извращаться...
Самое простое решение вывести на экран 15 простых чисел:
Print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47"
____________________________
VS2008 & VS2010
VB6

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

Re: Обратиться к элементу, зная его имя

Сообщение Денис » 25.09.2009 (Пт) 8:40

Calhoon писал(а):Меню не является контролом?

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

Calhoon
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 07.10.2007 (Вс) 18:01
Откуда: Новосибирск

Re: Обратиться к элементу, зная его имя

Сообщение Calhoon » 25.09.2009 (Пт) 8:55

Денис писал(а):
Calhoon писал(а):Меню не является контролом?

... компонентом является?

сложно ответить на этот вопрос =)
Самое простое решение вывести на экран 15 простых чисел:
Print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47"
____________________________
VS2008 & VS2010
VB6

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

Re: Обратиться к элементу, зная его имя

Сообщение Денис » 25.09.2009 (Пт) 9:00

Calhoon писал(а):сложно ответить на этот вопрос =)

Это вопрос риторический. Такие вещи как меню, таймеры и т.п. наследуются от класса Component.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Calhoon
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 07.10.2007 (Вс) 18:01
Откуда: Новосибирск

Re: Обратиться к элементу, зная его имя

Сообщение Calhoon » 25.09.2009 (Пт) 9:28

Денис писал(а):Это вопрос риторический. Такие вещи как меню, таймеры и т.п. наследуются от класса Component.

System.ComponentModel.Component? И как к нему применить, скажем, visible?
В общем, пока выкрутился проверкой таких "не Control"-элементов конструкцией "If TypeOf .. Is ..." и присваиванием им конктерного типа вроде ToolStripMenuItem и пр.
Самое простое решение вывести на экран 15 простых чисел:
Print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47"
____________________________
VS2008 & VS2010
VB6

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

Re: Обратиться к элементу, зная его имя

Сообщение MIT » 25.09.2009 (Пт) 15:24

Самый простой способ - вообще не приводить Object к типу:
Код: Выделить всё
Me.GetType.GetField("_"c & "ggg", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(Me).text = "ttt"
где ggg - System.Windows.Forms.ToolStripMenuItem
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Calhoon
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 07.10.2007 (Вс) 18:01
Откуда: Новосибирск

Re: Обратиться к элементу, зная его имя

Сообщение Calhoon » 27.09.2009 (Вс) 15:30

MIT писал(а):Самый простой способ - вообще не приводить Object к типу:
Код: Выделить всё
Me.GetType.GetField("_"c & "ggg", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(Me).text = "ttt"
где ggg - System.Windows.Forms.ToolStripMenuItem

Е-мое, а ведь и правда... Спасибо :)
Самое простое решение вывести на экран 15 простых чисел:
Print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47"
____________________________
VS2008 & VS2010
VB6


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

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

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

    TopList