2015-04-22 6 views
1

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

Я хочу получить доступ к моей метке из класса в другом пространстве имен. Это образец кода, чтобы лучше понять, что я пытаюсь сделать:

public partial class Main : Form 
    { 
     public Main() 
     { 
      InitializeComponent(); 
     } 
    } 



//class in another namespace 
class Servers 
    { 
     public void _SetlabelText() 
     { 
      Main.label1.Text = "New Text"; 
     } 
    } 

Как я должен сделать это правильный путь?

+2

Это неясно. Является ли класс серверов ответственным за создание формы «Главная»? Или это «Основные» экземпляры экземпляров серверов? Что вызывает '_SetlabelText()'? –

+0

В простых терминах вы не можете. Вы можете создать статический экземпляр формы и получить доступ к нему из родительского класса следующим образом: 'class Parent {public static Form myForm {get; задавать; } 'затем для доступа к нему из другого класса:' MyNameSpace.Parent.myForm.label1.Text = "некоторый текст"; 'или вы можете сделать то же, что и Джон, в ответ ниже, содержащий форму в нужном классе. – CalebB

+0

_SetlabelText() находится в классе Servers, но он вызывается в основной форме. Я просто хотел переместить методы в другом классе, чтобы немного очистить беспорядок. – Maria

ответ

3

Одним из вариантов является сохранить ссылку на форму в конструкторе, как это:

public class Servers 
{ 
    private Form _frmMain; 
    public Servers(Form frmMain) 
    { 
     _frmMain = frmMain; 
    } 
    public void SetlabelText() 
    { 
     _frmMain.label1.Text = "New Text"; 
    } 
} 

И использовать его как это:

public partial class Main : Form 
{ 
    public Main() 
    { 
     InitializeComponent(); 
     var servers = new Servers(this); 
     servers.SetlabelText(); 
    } 
} 

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

public partial class Main : Form 
{ 
    public Main() 
    { 
     InitializeComponent(); 
     label1.Text = Servers.GetTextForLabel(); 
    } 
} 
public class Servers 
{ 
    public static string GetTextForLabel() 
    { 
     return "New Text"; //(I assume this will be much more complex) 
    } 
} 
+1

Согласовано. Если вы начнете ссылаться на элементы управления Form из другого класса, в конечном итоге все становится более беспорядочным. Таким образом, несколько форм могут потенциально вызвать 'GetTextForLabel()', способствуя повторному использованию. И переименование метки на одной форме не разрывает отдельный класс. –

+0

Почему я не могу понять ваш первый пример. И почему это не работает для меня? Я действительно смущен – Maria

+0

@Maria Добавлена ​​реализация выше –

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