2009-04-08 2 views
3

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

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

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

Цените, если кто-то coudl пролить свет на то, почему это может произойти.

Благодаря

+0

Что вы имеете в виду, что вы не можете получить доступ к элементам управления в самом классе Form1, если только вы не создали функцию? Где вы помещаете этот код, если нет в функции? –

ответ

4

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

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

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

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

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

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

3

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

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

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

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

3

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

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

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

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

0

Взгляните на то, как это может быть реализовано с использованием шаблона MVP (образец кода): Implementing MVC with Windows Forms

UPDATE: Код в классе вы упоминаете на самом деле должно быть частью ведущего форме, которая имеет ссылку к форме (через интерфейс IView). Именно так вы должны разрабатывать свой код пользовательского интерфейса, а не напрямую обращаться к частным частям другой формы.

Смежные вопросы