2010-12-15 20 views
0

我是C#中的新手,但對編碼並不陌生 - 做了近二十年的工作 - 並且在構建的自定義控件中的屬性出現問題,該控件從Panel繼承。當我放置我的屬性時,我可以在Designer屬性列表中看到它們,甚至可以設置它們,但是在運行我的小應用程序時,似乎不使用這些屬性值。如果我以編程方式更改屬性,也是一樣的:沒有錯誤,但是我的控件什麼都不做,就好像它們沒有正確設置。但是,如果我在課堂上以編程方式進行練習,他們確實有用。我的猜測是,在我的屬性設置/獲取的東西是不正確的。請看到我是如何做下面的代碼塊:爲什麼我的控件的屬性不會在其類之外改變?

public class ColorStrip : Panel 
{ 
    // properties 
    // ------------------------------------------ 
    // size of color clusters (boxes) 
    private int _clusterSize = 20; 
    // controls if show the buttons panel 
    private Boolean _showButtons; 

    // property setters/getters 
    // ------------------------------------------ 
    // clusterSize... 
    public int clusterSize 
    { 
     get { return _clusterSize; } 
     set { _clusterSize = value; } 
    } 
    // showButtons... 
    public Boolean showButtons 
    { 
     get { return _showButtons; } 
     set { Console.Write(_showButtons); _showButtons = value; } 
    } 
    .... 

所以在我的形式,例如負載,甚至在點擊事件的地方,如果我把colorStrip1.showButtons = FALSE;或colorStrip1.showButtons = true;無論如何(在設計模式下將控件放置在窗體中後,colorStrip1將是實例名稱)... console.write始終表示'false';即使我在設計屬性列表中將其設置爲「true」,它也不會反映已確定的值,即使我將其默認爲true,也不會在外部進行更改。有任何想法嗎?非這些方法都不能獲得新的和外部安置的屬性值,顯然getter/setter的東西不起作用。在我看來,我並沒有按照我設定的方式,或在以外的課程獲得我的物業。它只適用於它,作爲魅力...任何幫助...非常感謝!

乾杯

P.S.爲了澄清SOLUTION:

在這種情況下,設置屬性沒有工作,因爲我試圖構造,這似乎是因爲它是,以及無法獲得新的值範圍內使用新的設定值時,建築事情。如果我更改屬性值在設計模式>屬性編輯器或在對象的外部代碼,說在它的父窗體的加載事件,它會改變它,但除了構造函數,當然:)可讀的所有方法:)

+0

是否有多個線程獲取和設置屬性?你能給我們測試代碼嗎? – DVD 2010-12-15 20:45:10

+1

請記住,您正在編寫'_showButtons'的*舊*值 - 如果您連續執行兩組,您是否看到新值? – 2010-12-15 20:49:40

+1

請注意,.NET *中的屬性應該使用pascal-casing命名,也就是說,第一個字母應該是大寫。 – Lucero 2010-12-15 21:17:36

回答

1

很可能執行順序的問題。您的屬性設置器只是設置一個變量,但實際上並不觸發控件上的任何內容來更新與此變量相關的狀態(例如添加或顯示我假設的按鈕)。

當您設置屬性時,其餘的初始化完成後,正在使用該值,否則不是因爲在初始化期間默認值仍然是屬性值。

你需要採取行動的制定者,這裏的一些僞代碼來說明:

set { 
    _showButtons = value; 
    if (alreadyInitialized) { 
    UpdateButtons(); 
    } 
} 

注:請務必先設定的值,然後採取行動 - 否則你最終使用的舊值(就像你的Console.Write()正在做)。

+0

嗯,我沒有進一步實現這個屬性的任何東西,但只能在構造函數和構造函數調用的函數中讀取它:它應該加載一個帶有顏色的txt文件代碼並開始添加顏色簇 - 色彩面板 - 但如果showButtons爲true或false,則左起始位置應該不同 - 如果爲true,則顏色簇的起始左側應該爲100像素,如果爲false,則應爲0 – litium258 2010-12-16 01:42:46

+0

是!這確實是一個執行順序....我發現了這個問題:如果我嘗試訪問我的屬性在構造函數中,他們不會有外部的價值,也不使用設計屬性編輯器,我猜爲什麼:對象沒有準備好在那時候。哦,傻我!如果我嘗試訪問任何其他方法的屬性,那麼它的工作原理。謝謝大家! - 感謝上帝,我小睡了一下 - – litium258 2010-12-16 01:53:19

0

引用的代碼看起來沒有問題。你確定你引用了ColorStrip的同一個實例嗎?另外,請檢查您的.Designer.cs文件以確保設置屬性的代碼在那裏。

事實上,試圖通過使用自動實現的屬性簡化代碼:

public int clusterSize { get;set;} 
public Boolean showButtons {get;set;} 

public ColorStrip() { ... clusterSize = 20; ... } 
相關問題