C#. Как обратиться к текстбоксу "по имени"?

Автор Тема: C#. Как обратиться к текстбоксу "по имени"?  (Прочитано 12501 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Доброго времени суток, уважаемые форумчане! Помогите пожалуйста разобраться с вопросом, указанным в теме.
По сути мне нужен код, аналогичный такому коду в VBA:
Код - Visual Basic [Выбрать]
  1. Form.Controls.Item(name)=...
где name - это переменная формата стринг, которой динамически присваивается значение имени нужного текстбокса.
П.С. Я понимаю, что вопрос примитивный, но не смог я его решить своими силами. :( Так что буду рад любой помощи!
« Последнее редактирование: 10-03-2016, 11:04:26 от R.I.Chernov »
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
где name - это переменная формата стринг, которой динамически присваивается значение имени нужного текстбокса.
Если программно обратиться к контролу на форме то:
Код - C# [Выбрать]
  1.  static void Main ( ) {
  2.             TestYield.Form1 frm = new TestYield.Form1();
  3.             System.Windows.Forms.Control control = frm.Controls["button1"];
  4.             Console.WriteLine(control.Text);
  5.  
  6.  
  7.             System.Windows.Forms.Application.Run(frm);
  8.  
  9.             return;
  10.         }
  11.  

Оно?
« Последнее редактирование: 10-03-2016, 11:31:46 от Александр Ривилис »

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Оно?
Не уверен. Пытаюсь осмыслить то, что вы написали. К сожалению слабоваты мои знания... Спасибо за ответ!
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Не уверен. Пытаюсь осмыслить то, что вы написали.
ну в примере программный доступ к существующему контролу. Его можно привести в данном примере к кнопке сразу (ну в вашем случае это может быть текст бокс):
Код - C# [Выбрать]
  1.  System.Windows.Forms.Control control = frm.Controls["button1"];
  2.   if (control is Button) { Button tb = (Button)control; }
  3.  
или смутило, что я в примере к кнопке обращаюсь?
« Последнее редактирование: 10-03-2016, 11:32:16 от Александр Ривилис »

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
или смутило, что я в примере к кнопке обращаюсь?
Нет, не смутило. Я понял, что это кнопка, и что текстбокс от кнопки не должен сильно отличаться.
Но я не понял принцип, по которому осуществляется доступ. Если не сложно, не могли бы вы мне еще немного помочь.
Вот у меня есть форма с именем FORMA, и текстбокс с именем TB. Правильно ли я понимаю, что по аналогии с вашей, первая строка моего кода должна выглядеть
Код - C# [Выбрать]
  1. System.Windows.Forms.Control control = FORMA.Controls["TB"];
или нет? Программа мне пишет ошибку..
П.С. Спасибо за ваше терпение! :)
« Последнее редактирование: 10-03-2016, 11:02:33 от R.I.Chernov »
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Вот у меня есть форма с именем FORMA, и текстбокс с именем TB
дело в том что в на VBA (да и на допотопном VB6) форма не была полноценным классом, точнее она классом была, только статическим и поэтому она существовала в одном экземпляре.
В C# форма это не статический класс, поэтому сначала нужно сделать экземпляр формы, в моем примере это было в строке:
Код - C# [Выбрать]
  1.  TestYield.Form1 frm = new TestYield.Form1();

здесь  TestYield- это пространство имен, у вас его может не быть.
и только после этого обращать к экземпляру frm и что то из него извлекать.
Напрямую из Form1 ничего извлекать нельзя.
напрямую извлекать можно только из статических классов, а класс Form1статическим не является.
Так что обращайтесь к экземпляру формы и будет работать
« Последнее редактирование: 10-03-2016, 11:32:44 от Александр Ривилис »

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Так что обращайтесь к экземпляру формы и будет работать

Спасибо большое! Я  не понимал, что надо работать с экземпляром формы.
Но у меня все равно не работает код, при попытке создания экземпляра формы всплывает ошибка (см. фото)

Итоговый код такой:

Код - C# [Выбрать]
  1. namespace Тест2
  2. {
  3.     public partial class FORMA : Form
  4.     {
  5.         public FORMA()
  6.         {
  7.             InitializeComponent();
  8.             TEST();
  9.         }
  10.         public void TEST()
  11.         {
  12.             Тест2.FORMA frm = new Тест2.FORMA();
  13.             System.Windows.Forms.Control ctrl = frm.Controls["TB"];
  14.             ctrl.Text = "123";
  15.         }
  16.     }
  17. }
« Последнее редактирование: 10-03-2016, 11:00:56 от R.I.Chernov »
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 09-03-2016, 16:29:00

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Но у меня все равно не работает код, при попытке создания экземпляра формы всплывает ошибка
Ну если вы обратите внимание на мой первый пример, то там работа идет из процедуры Main т.е. вне класса формы.
Если действия происходят внутри класса (а код конструктора класса всегда внутри класса) то к самому экземпляру правильно обращаться через оператор this. Замените код в процедуре Test:
Код - C# [Выбрать]
  1.  public void TEST ( ) {
  2.            System.Windows.Forms.Control ctrl = this.Controls["TB"];
  3.            ctrl.Text = "123";
  4.         }
  5.  
должно заработать.
А в вашем случае, батенька, получилась рекурсия. Вы вызываете конструктор формы, который в свою очередь вновь вызывает создание экземпляра формы и снова вызывается конструктор нового экземпляра и так до того пока память в стеке не закончится.
« Последнее редактирование: 10-03-2016, 11:30:47 от Александр Ривилис »

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Спасибо огромное, вы мне очень помогли!
В программировании я новичок...но ненадолго! ;)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
mikazakov, R.I.Chernov
Ребята! Не ленитесь форматировать код согласно правил. Это же так просто...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Это же так просто...

Не видел раньше вашего видео, в связи с чем  не знал, как записать код  C#. Вроде все подправил.
П.С. Александр, не могли бы пояснить, за что отвечает кнопка "переключить вид", которую надо "отжать" согласно инструкции?
В программировании я новичок...но ненадолго! ;)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
П.С. Александр, не могли бы пояснить, за что отвечает кнопка "переключить вид", которую надо "отжать" согласно инструкции?
При нажатой кнопке включен режим WYSIWIG. Но в этом режиме не работает подсветка кода. Точнее из раскрывающегося списка не вставляются теги code.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Спасибо.
В программировании я новичок...но ненадолго! ;)