2013-05-10 76 views
5

我在用戶控件MainScreen中有一個控件lblDate。我想通過Date的方法對其進行修改,該方法位於另一個項目AoWLibrary中。我無法引用它,因爲AoWLibrary是第一個項目的依賴項。從另一個項目修改Windows窗體控件

我試圖讓lblDate靜態的,而是編譯器保持在我扔的錯誤,我有時間似乎訪問不能的公共屬性:

public Label LabelDate 
    { 
     get { return lblDate; } 
     set { lblDate = value; } 
    } 

在課堂上的日期,我需要公有方法CalculateDate修改lblDate

的Text屬性
public static void CalculateDate() 
    { 
     GameDate = month.ToString() + "/" + displayDay.ToString() + "/" + year.ToString(); 

    // LabelDate.Text = GameDate; 
    // This is essentially what I need to do 
    } 

而且,我甚至不能在其他控件訪問lblDate在同一個項目。

+2

如果您在控制器類中有實例化的對象,則可以修改其他類的控件。 – lexeRoy 2013-05-10 02:50:20

+0

設計師不會自動執行該操作嗎? – 2013-05-10 02:55:17

+0

你可以在哪裏調用另一個表單顯示代碼(或代碼示例就足夠了)? – lexeRoy 2013-05-10 03:06:46

回答

1

所以,一般的想法是,你需要跟蹤的是什麼範圍。有很多方法可以去做你想做的事情,但是它們中的任何一個都依賴於以完全不瞭解的方式正確引用對象。別擔心,每個人都必須在某個時間點解決這個問題。

當您試圖將該成員設爲靜態時,編譯器抱怨的原因是因爲標籤本身不是靜態的。被捆綁到一個單一的MainScreen實例上,它在靜態上下文中沒有意義,它根據定義是一個沒有任何固有引用的特定MainForm的範圍。

您的Date類當然也是一個完全不同的上下文,但它的非靜態成員確實可以訪問Date的實例。在創建它之前,這兩個環境之間沒有任何路徑。靜態路由實際上已經工作了(查看Singleton模式:想法是你靜態地存儲一個類的第一個也是唯一的實例,並從其他地方引用它),但可能不是好的設計。其他的方法是通過傳遞Date來實現MainScreen(最好通過一個接口)或者甚至LabelDate本身。所有這些都可以得到你需要一起交談的兩件作品。

但是,我想建議你考慮一下你的遊戲狀態存儲在哪裏。它是在圖書館還是在消費大會?如果是前者,則可能需要考慮創建一個完整的GUIless模型,該模型需要在庫類中進行存儲和操作,並且僅在主應用程序中使用現成的數據。另一種選擇是你的模型存在於主應用程序中,並根據需要回調你的庫。在這種情況下,您現在應該堅持要求圖書館提供答案(或者至多在圖書館收聽事件),並且不要期望它自己回到應用程序(無論是獲取還是提供信息)。

在弄清楚如何做到這一點,您可能會發現您的範圍管理問題更容易處理。即使一點點好的建築也可以走很長的路。

但是,如果這一切都有點壓倒,不要過分強調它。這聽起來像是你爲了好玩而做的,這是一個很好的學習方式。你會遇到這樣的問題,並且會選擇一個好的設計或者不太好的設計,但是無論你如何與重要的概念搏鬥,它們都會更好。

+0

我剛剛簽出Singleton並將其實施到我的代碼中,我對它的工作方式感到非常滿意。謝謝你的建議。這應該對我很有幫助。 – 2013-05-10 06:24:31

0

屬性LabelDate來自您的userControl MainScreen的類,但您不會安裝任何用戶控件。您希望修改哪個MainScreen實例呢?

你應該做的

this.controlMainScreen.LabelDate = GameDate; 

考慮到你在你的評論說,你有

FormMain.Designer.cs there is: this.controlMainScreen = new Adventurers_of_Wintercrest.UserControls.MainScreen(); 
+0

在FormMain.Designer.cs中有: this.controlMainScreen = new Adventurers_of_Wintercrest.UserControls.MainScreen(); 這不是什麼需要發生? – 2013-05-10 03:29:28

+0

看我的編輯。這當然會起作用,假設你的代碼是在FormMain中(你永遠不會指定它在哪裏) – 2013-05-10 03:31:16

+0

我發佈的第一個位於MainScreen.cs中,位於Adventurers_of_Wintercrest.UserControls命名空間中。第二個位於AoWLibrary命名空間中的Date.cs中。 – 2013-05-10 03:37:54

0

我寧願建議你讓你的GameDate方法返回一個字符串,然後調用它你的主要項目是本質上是什麼庫是爲了。例如: -

public static string CalculateDate() 
{ 
    return month.ToString() + "/" + displayDay.ToString() + "/" + year.ToString(); 
} 

//in your main project 
LabelDate.Text = myLibrary.CalculateDate(); 

對於同一個項目從其他控件訪問它,你應該使用一個委託 - 提供執行另外一個委託,聲明委託,並從CaculateDate調用該函數。例如:

public delegate void dateSet(string); 

public void setDate(string date) 
{ 
    labelDate.Text = date; 
} 

然後在CaculateDate方法:

labeldate.Invoke(new MainForm.dateSet(), GameDate); 
+0

代表應該去哪裏? – 2013-05-10 03:57:32

+0

委託應該在標籤所在的主項目中聲明。 – 2013-05-10 03:58:32

相關問題