2009-10-06 10 views
4

我有一個C#類庫,它使用一個窗體(它也在庫中)。假設我在此表單上有一個編輯框,名爲editContents。在常規的形式申請,我已經習慣了能夠將收購這樣的編輯框:.NET - 正確的方法來獲取表單上的控件的引用

class MainForm 
{ 
    void Method() 
    { 
      this.editContents.Text = "Hi"; 
    } 
} 

我想在常規形式應用在幕後發生一些神奇的,因爲編輯框構件處於私人MainForm類,但我仍然可以像公共成員一樣訪問它。

但在我的類庫中,我無法像這樣訪問編輯框。我實例化和顯示形式爲「手動」是這樣的:

form = new MyForm(); 
form.Show(); 

如何正確獲取來自這種形式的editContents控制?

+0

更好的問題是「你爲什麼試圖從庫中修改表單控件?」 – Powerlord 2009-10-06 13:26:23

回答

14

你可以讓它變成一個公開訪問Property,通過添加一些像這樣的代碼:

public String EditContents // for just the "Text" field 
{ 
    get { return this.editContents.Text; } 
    set { this.editContents.Text = value; } 
} 

或者:

public TextBox EditContents // if you want to access all of the TextBox 
{ 
    get { return this.editContents; } 
    set { this.editContents = value; } 
} 
+2

第一種方法更可取,第二種方法是弱化封裝,通常不需要。 – 2009-10-06 13:38:38

0

您可以通過控件集合AQUIRE它。

form.Controls.Find("nameOfControl", true); 
+0

如果''nameOfControl''更改會發生什麼?代碼仍然可以編譯,但它會在運行時引發異常**。 – Donut 2009-10-06 13:27:20

5

「魔術」是爲* .Designer.cs文件中的文本框生成一個字段。默認情況下,這個字段是私人的。如果要更改其可訪問性,請在表單設計器中選擇您的文本框,然後將「修改器」屬性更改爲Public。

但是,這可能不是一個好主意,公開公開您的表單的所有控件。你可以把它包裝在一個像Donut建議的房產中,這更清潔。

2

私人成員可以在他們的聲明類中訪問。這就是爲什麼你可以從MainForm中訪問editContents的原因。
私人成員無法從其聲明類之外訪問。
(它是private的定義,也沒有神奇的)

您可以在一個公共屬性把它包裝:

public TextBox EditContents 
{ 
    get { return this.editContents; } 
} 
0

在通過form參考VS訪問Method()函數內部成型構件的區別在你最後的片段中,你的Method()函數是你的窗體類的成員,因此被允許訪問該類的其他私有成員。

1

在第一種情況下,您可以訪問editContents,因爲您處於表單的範圍內。

正如@Donut所說的,您可以爲您的圖書館的用戶公開一個屬性,以便與控件一起玩耍。如果你想限制訪問,你可以寫一個方法。

例如

void SetContentForEditor(string text) 
{ 
    editContent.Text = text; 
} 

而且,那麼你就可以做出SetContentForEditor
例如呼叫

myForm.SetContentForEditor("hello world"); 
0

我將介紹其中通知所有訂閱者此事件在更改發生後的文本,應在形式設置庫的事件。表單應附加到此事件並自行設置文本框內容。

相關問題