2009-04-08 51 views
3

我在一個小的Windows窗體項目使用Visual Studio 2008 我添加了一個自定義類的項目目前正致力於在C#中,但在這個類,我無法訪問的形式控件(如列表框,文本框,按鈕)以編程方式更改其屬性。無法訪問的WinForms控制的一類

類文件使用了system.windows.forms,並且所有文件都在同一個命名空間中。 令人驚訝的是,我也無法訪問form1類本身的控件,除非我在類中創建一個方法,然後智能感知彈出各種控件的名稱。

但是,intellisense根本不顯示控件的名稱。

欣賞是否有人發現可能會發生的原因。

感謝

+0

你的意思是你不能訪問Form1類本身的控件,除非你創建了一個函數?如果不是在函數中,你在哪裏放置代碼? – 2009-04-08 07:26:51

回答

4

封裝器件的單獨的類不應直接談話的控制。應該,而是暴露在您的(外)的屬性和方法Control - 例如:

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

對於更復雜的操作,可以優選使用的方法;屬性對於簡單讀取/寫入的謹慎值是很好的。

這提供了許多優點:

  • 就可以了,如果需要的話,抽象細節的接口(或類似)
  • 你可以改變實現(例如,使用窗體的文本爲標題)不改變調用代碼
  • 它只是......漂亮;-p
+0

我認爲這裏的問題是他沒有對錶單的引用。在這種情況下,添加屬性將無濟於事。除此之外,我完全同意不將控制措施公開 – 2009-04-08 07:26:07

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界面)。這就是你應該如何設計你的UI代碼,而不是直接訪問其他Form的私有部分。