2015-04-22 68 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新增上面的實現 –

相關問題