2015-04-22 155 views
1

我知道这已被问了数千次,但仍然经过大量研究后,我找不到解决方案,我对此帖非常抱歉。从另一个类/命名空间访问表单标签

我想从另一个命名空间的类访问我的Label。 这是一个代码示例,以更好地了解什么,我试图做的:

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



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

我怎么做的正确方法?

+2

这个不清楚。 Servers类负责实例化“主”表单吗?或者是“主”形式实例化服务器?什么叫'_SetlabelText()'? –

+0

用简单的术语,你不能。你可以创建一个表单的静态实例并以父类的方式访问它:'''Parent {public static Form myForm {get;组; }'然后从另一个类访问它:'MyNameSpace.Parent.myForm.label1.Text =“一些文本”;'或者你可以像乔恩在答案中所做的那样填写所需类中的表单。 – CalebB

+0

_SetlabelText()在服务器类中,但它在主窗体中被调用。我只是想将这些方法移到另一个类中,这样我就可以清理一些混乱。 – 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

同意。如果您从另一个课程开始引用表单的控件,则从长远来看,情况会变得更加混乱。这样,多个表单可能会调用'GetTextForLabel()',以提高可重用性。并且在一个表单上重命名标签不会突然打破单独的类。 –

+0

为什么我似乎无法理解你的第一个例子。为什么它不适合我?我真的很困惑 – Maria

+0

@Maria新增上面的实现 –

相关问题