#c# #winforms #controls
#c# #winforms #элементы управления
Вопрос:
У меня есть приложение WinForm. В основной форме имеется ряд элементов управления, таких как метки, текстовые поля и т.д.
Если у меня есть другой класс в той же сборке, как я могу получить доступ к этим элементам управления?
Например, из моего нового класса я хочу обновить метку в Form1?
Комментарии:
1. На всякий случай: убедитесь, что вы делаете это в том же потоке
2. Сначала вам нужно будет передать ссылку Form1 на этот класс.. с такой ссылкой вы можете использовать идею, предложенную другими, для предоставления общедоступного свойства.
3. Расширяя то, что сказал @smirkingman, если вы собираетесь вызывать эти методы в потоках, вам нужно будет использовать Control. Вызвать
Ответ №1:
В свойстве метки (или любого элемента управления) установите для параметра «Модификаторы» значение «Общедоступный»
Теперь вы можете получить доступ к метке из объекта формы
Form1 f = new Form1()
f.lblMyLabel.Text = "My Text"
Ответ №2:
Одним из способов было бы создать общедоступные свойства в вашем классе Form1, которые предоставляют элементы управления, которые вы пытаетесь изменить
Например, если ваша метка называется label1 в конструкторе, вы могли бы сделать что-то вроде этого:
public Label MyForm1Label { get { return label1; } }
Ответ №3:
выберите элемент управления, к которому вы хотите получить доступ из другого класса / формы. перейдите к его свойству и установите для его модификаторов значение «internal» (если вы хотите использовать его только в той же сборке) .
теперь, где бы вы ни хотели использовать его в той же сборке, просто создайте объект такой формы, как
myForm objform = new myForm();
objform.txtName.Text="any text";
затем вы можете отобразить эту форму с помощью objform.show(); или objform.showdialog();
но я думаю, что это не решит вашу проблему, потому что я чувствую, что ваша форма уже отображается на экране, а из другой формы / класса вы хотите изменить значение ее метки / текстового поля, поэтому для этого вам придется взять этот текущий объект form, иначе он не покажет никаких изменений в отображаемой в данный момент форме.
поэтому я думаю, что одноэлементный шаблон даст вам идеальное решение. просто создайте класс и в этом классе создайте статический объект этой формы, а затем создайте статическую функцию и проверьте, инициализирован ли уже объект, который не инициализирует его, и используйте существующий, чтобы инициализировать его иным образом.
также существует множество других решений, например, путем создания общедоступного свойства, но вам придется использовать ссылку на тот же объект текущей отображаемой формы, чтобы увидеть, как изменения отражаются на текущей отображаемой форме
Ответ №4:
Помимо решений, которые уже были упомянуты, вы можете создать некоторый общедоступный метод для вашей формы, который обеспечит желаемую функциональность (может быть, неплохо, если некоторые изменения должны отображаться в нескольких элементах управления — вашим другим классам не нужно запоминать, какой из них нужно изменить)
public void SetSomething(int value)
{
Control1.value = value;
Control2.value = value;
...
}
Ответ №5:
Самый простой способ — использовать:
Form1 f = новая Form1() f.lblMyLabel.Text = «Мой текст»
Следовательно, вы должны установить для метки Form1 «lblMyLabel» просто значение public. Я сделал это с помощью RichTextBox.
Комментарии:
1. Пожалуйста, правильно отформатируйте свой ответ. Ваш ответ идентичен уже опубликованному ответу.