.NET - Правильный способ получить ссылку на элемент управления в форме - PullRequest
4 голосов
/ 06 октября 2009

У меня есть библиотека классов C #, которая использует форму (которая также находится в библиотеке). Допустим, у меня есть поле для редактирования в этой форме, которое называется editContents . В обычном приложении формы я привык получать окно редактирования следующим образом:

class MainForm
{
     void Method()
     {
          this.editContents.Text = "Hi";
     }
}

Я полагаю, что какое-то волшебство происходит за кулисами в обычном приложении форм, потому что член поля редактирования является закрытым в классе MainForm, но я все еще могу получить к нему доступ как открытый член.

Но в моей библиотеке классов я не могу получить доступ к полю редактирования, как это. Я создаю экземпляр и показываю форму "вручную" следующим образом:

form = new MyForm();
form.Show();

Как мне правильно получить editContents элемент управления из этой формы?

Ответы [ 7 ]

14 голосов
/ 06 октября 2009

Вы можете сделать его общедоступным Свойством , добавив такой код:

public String EditContents // for just the "Text" field
{
   get { return this.editContents.Text; }
   set { this.editContents.Text = value; }
}

Или:

public TextBox EditContents // if you want to access all of the TextBox
{
   get { return this.editContents; }
   set { this.editContents = value; }
}
5 голосов
/ 06 октября 2009

"Волшебство" заключается в том, что для вашего текстового поля создается файл * .Designer.cs. По умолчанию это поле является закрытым. Если вы хотите изменить его доступность, выделите текстовое поле в конструкторе форм и измените свойство «Модификаторы» на «Public».

Это, однако, может быть плохой идеей публичного раскрытия всех элементов управления вашей формы. Вместо этого вы можете обернуть его в свойство, как предлагает Donut, которое чище.

2 голосов
/ 06 октября 2009

Частные участники доступны в пределах своего декларирующего класса. Вот почему вы можете получить доступ к editContents из MainForm.
Частные члены недоступны извне своего декларирующего класса.
(это определение private, магии нет)

Вы можете обернуть его в публичную собственность:

public TextBox EditContents
{
   get { return this.editContents; }
}
1 голос
/ 06 октября 2009

В первом случае вы можете получить доступ к editContents, потому что находитесь в области действия формы.

Как сказал @Donut, вы можете предоставить свойство пользователям вашей библиотеки, чтобы поиграть с этим элементом управления. Если вы хотите ограничить доступ, вместо этого вы можете написать метод.

например.

void SetContentForEditor(string text)
{
   editContent.Text = text;
}

И затем вы можете позвонить на SetContentForEditor
например,

myForm.SetContentForEditor("hello world");
0 голосов
/ 06 октября 2009

Я бы представил событие в библиотеке, которое уведомляет всех подписчиков об этом событии, когда происходит изменение в тексте, и должно быть задано в форме. Форма должна прикрепиться к этому событию и установить текстовое поле самостоятельно.

0 голосов
/ 06 октября 2009

Разница в доступе к члену формы внутри функции Method() по сравнению со ссылкой form в вашем последнем фрагменте состоит в том, что ваша функция Method() является членом класса вашей формы и поэтому имеет доступ к другим частным Члены класса.

0 голосов
/ 06 октября 2009

Вы можете приобрести его через коллекцию Controls.

form.Controls.Find("nameOfControl", true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...