Невозможно получить доступ к элементу управления Winforms в классе - PullRequest
3 голосов
/ 08 апреля 2009

В настоящее время я работаю над небольшим проектом Windows Forms на C # с использованием Visual Studio 2008. Я добавил собственный класс в проект, но в этом классе я не могу получить доступ к элементам управления форм (таким как список, текстовое поле, кнопки), чтобы программно изменить их свойства.

В файле класса используется system.windows.forms, и все файлы находятся в одном пространстве имен. Удивительно, но я также не могу получить доступ к элементам управления в самом классе form1, если я не создаю метод в классе, а затем intellisense выскакивает имена различных элементов управления.

в пользовательском классе, однако, intellisense вообще не показывает имена элементов управления.

Ценю, если кто-то может пролить свет на то, почему это может происходить.

Спасибо

Ответы [ 4 ]

4 голосов
/ 08 апреля 2009

Инкапсуляция означает, что ваш отдельный класс не должен общаться напрямую с элементами управления. Вместо этого вы должны выставить свойства и методы на вашем (внешнем) Control - например:

public string TitleText {
    get {return titleLbl.Text;}
    set {titleLbl.Text = value;}
}

Для более сложных операций может быть предпочтительнее использовать метод; свойства хороши для простого чтения / записи для дискретных значений.

Это дает различные преимущества:

  • при необходимости вы можете абстрагировать детали от интерфейса (или аналогичного)
  • вы можете изменить реализацию (например, использовать текст формы для заголовка) без изменения вызывающего кода
  • это просто ... приятнее; -p
3 голосов
/ 08 апреля 2009

Элементы управления в Form1 будут частными

partial class Form1
{
   //elided other good stuff 
   private System.Windows.Forms.Button button1;
}

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

Вы можете сделать это публично, как подсказывает @ abatishchev (но это было бы действительно плохой идеей). Лучшим планом было бы использовать свойства, которые @ Marc Gravell предлагает. Тем не менее, вам все равно нужно передать ссылку на форму классу, который вы хотите использовать для свойств (как указано @ Rune Grimstad ). Вы пытаетесь написать класс в своем приложении, который напрямую запрашивает данные в интерфейсе пользователя. Обычно это не очень хорошая идея. Класс должен быть полностью заинтересован в своей цели. Вы должны разрабатывать свойства или события для определенных битов данных, к которым классу нужен доступ, и не обязательно передавать его всей форме, возможно, просто значениям, с которыми ему нужно работать или изменять.

3 голосов
/ 08 апреля 2009

Вашему классу нужна ссылка на форму, чтобы это работало. Причина этого в том, что форма не является статическим классом, поэтому вы можете иметь несколько его экземпляров.

Лучший способ дать ему ссылку, вероятно, это передать ее в конструктор классов. Тогда класс будет иметь ссылку на форму и может использовать эту ссылку для изменения элементов управления.

Альтернативный вариант, который вы могли бы использовать, если вы на 100% уверены, что у вас будет открыт только один экземпляр вашей формы, - это добавление открытого статического свойства в класс форм, который возвращает экземпляр формы. Затем это свойство будет доступно для использования в другом классе.

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

0 голосов
/ 08 апреля 2009

Посмотрите, как это можно реализовать с помощью шаблона MVP (пример кода): Реализация MVC с Windows Forms

ОБНОВЛЕНИЕ: код в классе, который вы упоминаете, на самом деле должен быть частью предъявителя формы, который имеет ссылку на форму (через интерфейс IView). Именно так вы должны разрабатывать свой код пользовательского интерфейса, а не путем прямого доступа к частным частям другой формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...