Сообщество программистов Autodesk в СНГ

ADN Club => Inventor API => Тема начата: R.I.Chernov от 09-03-2016, 11:51:32

Название: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: R.I.Chernov от 09-03-2016, 11:51:32
Доброго времени суток, уважаемые форумчане! Помогите пожалуйста разобраться с вопросом, указанным в теме.
По сути мне нужен код, аналогичный такому коду в VBA:
Код - Visual Basic [Выбрать]
  1. Form.Controls.Item(name)=...
где name - это переменная формата стринг, которой динамически присваивается значение имени нужного текстбокса.
П.С. Я понимаю, что вопрос примитивный, но не смог я его решить своими силами. :( Так что буду рад любой помощи!
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: mikazakov от 09-03-2016, 12:19:22
где 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.  

Оно?
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: R.I.Chernov от 09-03-2016, 12:50:34
Оно?
Не уверен. Пытаюсь осмыслить то, что вы написали. К сожалению слабоваты мои знания... Спасибо за ответ!
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: mikazakov от 09-03-2016, 13:38:44
Не уверен. Пытаюсь осмыслить то, что вы написали.
ну в примере программный доступ к существующему контролу. Его можно привести в данном примере к кнопке сразу (ну в вашем случае это может быть текст бокс):
Код - C# [Выбрать]
  1.  System.Windows.Forms.Control control = frm.Controls["button1"];
  2.   if (control is Button) { Button tb = (Button)control; }
  3.  
или смутило, что я в примере к кнопке обращаюсь?
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: R.I.Chernov от 09-03-2016, 14:12:42
или смутило, что я в примере к кнопке обращаюсь?
Нет, не смутило. Я понял, что это кнопка, и что текстбокс от кнопки не должен сильно отличаться.
Но я не понял принцип, по которому осуществляется доступ. Если не сложно, не могли бы вы мне еще немного помочь.
Вот у меня есть форма с именем FORMA, и текстбокс с именем TB. Правильно ли я понимаю, что по аналогии с вашей, первая строка моего кода должна выглядеть
Код - C# [Выбрать]
  1. System.Windows.Forms.Control control = FORMA.Controls["TB"];
или нет? Программа мне пишет ошибку..
П.С. Спасибо за ваше терпение! :)
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: mikazakov от 09-03-2016, 14:25:00
Вот у меня есть форма с именем FORMA, и текстбокс с именем TB
дело в том что в на VBA (да и на допотопном VB6) форма не была полноценным классом, точнее она классом была, только статическим и поэтому она существовала в одном экземпляре.
В C# форма это не статический класс, поэтому сначала нужно сделать экземпляр формы, в моем примере это было в строке:
Код - C# [Выбрать]
  1.  TestYield.Form1 frm = new TestYield.Form1();

здесь  TestYield- это пространство имен, у вас его может не быть.
и только после этого обращать к экземпляру frm и что то из него извлекать.
Напрямую из Form1 ничего извлекать нельзя.
напрямую извлекать можно только из статических классов, а класс Form1статическим не является.
Так что обращайтесь к экземпляру формы и будет работать
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: R.I.Chernov от 09-03-2016, 14:54:38
Так что обращайтесь к экземпляру формы и будет работать

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

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

Код - 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. }
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: mikazakov от 09-03-2016, 15:04:06
Но у меня все равно не работает код, при попытке создания экземпляра формы всплывает ошибка
Ну если вы обратите внимание на мой первый пример, то там работа идет из процедуры Main т.е. вне класса формы.
Если действия происходят внутри класса (а код конструктора класса всегда внутри класса) то к самому экземпляру правильно обращаться через оператор this. Замените код в процедуре Test:
Код - C# [Выбрать]
  1.  public void TEST ( ) {
  2.            System.Windows.Forms.Control ctrl = this.Controls["TB"];
  3.            ctrl.Text = "123";
  4.         }
  5.  
должно заработать.
А в вашем случае, батенька, получилась рекурсия. Вы вызываете конструктор формы, который в свою очередь вновь вызывает создание экземпляра формы и снова вызывается конструктор нового экземпляра и так до того пока память в стеке не закончится.
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: R.I.Chernov от 09-03-2016, 16:28:56
Спасибо огромное, вы мне очень помогли!
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: Александр Ривилис от 09-03-2016, 20:31:00
mikazakov, R.I.Chernov
Ребята! Не ленитесь форматировать код согласно правил. Это же так просто...
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: R.I.Chernov от 10-03-2016, 11:08:48
Это же так просто...

Не видел раньше вашего видео, в связи с чем  не знал, как записать код  C#. Вроде все подправил.
П.С. Александр, не могли бы пояснить, за что отвечает кнопка "переключить вид", которую надо "отжать" согласно инструкции?
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: Александр Ривилис от 10-03-2016, 11:30:19
П.С. Александр, не могли бы пояснить, за что отвечает кнопка "переключить вид", которую надо "отжать" согласно инструкции?
При нажатой кнопке включен режим WYSIWIG (https://ru.wikipedia.org/wiki/WYSIWYG). Но в этом режиме не работает подсветка кода. Точнее из раскрывающегося списка не вставляются теги code.
Название: Re: C#. Как обратиться к текстбоксу "по имени"?
Отправлено: R.I.Chernov от 10-03-2016, 13:49:47
Спасибо.