2010-12-15 6 views
0

私はC#で新しくなっていますが、コーディングには新しくなく、20年近く行っていますが、Panelから継承したカスタムコントロールのプロパティに問題があります。プロパティを置くと、Designerのプロパティリストに表示され、設定することもできますが、小さなアプリケーションを実行すると、これらのプロパティの値は使用されないようです。プログラムでプロパティを変更した場合も同じ:エラーはありませんが、コントロールは何もしません。正しく設定されていないようです。しかし、私がクラスを計画的に行うと、彼らは働きます。私の推測では、私のプロパティの何かが設定されている/物事を得ることは正しくないということです。私は偽= colorStrip1.showButtonsを置けば、なぜ私のコントロールのプロパティはクラス外で変更されませんか?

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 = true; whatever(colorStrip1はコントロールをデザインモードでフォームに配置した後のインスタンス名)... console.writeは常に 'false'と表示します。私が 'true'としてデザインプロパティリストに設定したとしても、デフォルト値をtrueにしても、決済された値は反映されず、外部的に変更されることはありません。何か案は?メソッドのどれも、新しく外部的に解決されたプロパティ値も取得しません。明らかに、getter/setterは機能しません。私は私が設定したり、私のプロパティを取得する方法を正しくしていないと思われる外部クラス。それは魅力として、その内部だけで動作します...どんな助け...非常に感謝します!

乾杯

リチウム

P.S.明確にする解決策:

この場合、プロパティを設定すると、の新しい設定値を使用しようとしていたため、が機能しませんでした。これは新しい値を得ることができないようです事。 プロパティの値を(デザインモード>プロパティエディタまたはオブジェクトの外部コード)に変更すると、親フォームのロードイベントのは変更されますが、コンストラクタ以外のすべてのメソッドでは読み取り可能です。

+0

プロパティを取得して設定するスレッドが複数ありますか?テストコードを教えていただけますか? – DVD

+1

'_showButtons'の* old *値を書き出していることに注意してください - 2つのセットを連続して実行すると、新しい値が見えますか? –

+1

.NET *のプロパティは、パスカルケーシングを使用して名前を付ける必要があります。つまり、最初の文字は大文字にする必要があります。 – Lucero

答えて

1

それはおそらく、実行の順序の問題です。あなたのプロパティ設定ツールは変数を設定するだけですが、実際にこの変数に関連する状態を更新するためにコントロール上で何もトリガーしません(例えば、私が仮定するボタンの追加や表示など)。

初期化の残りの部分が実行され、値が使用されている場合は、初期値のままではデフォルト値は依然としてプロパティ値であるためではありません。あなたがセッターに作用する必要が

は、ここで説明するためにいくつかの擬似コードです:

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

注:行動、その後、最初の値を設定してください - そうあなたは自分のような(古い値を使用して終了しますConsole.Write()しています)。

+0

私はこのプロパティで何も実装するつもりはありませんが、コンストラクタとコンストラクタが呼び出す関数でのみ読み込みます:色付きのtxtファイルをロードする必要がありますコードを追加し、カラークラスタ - 色付きパネルの追加を開始します。ただし、showButtonsがtrueまたはfalseの場合、開始左は異なるはずです。 - trueの場合、カラークラスタの左端は100ピクセル、falseなら0 – litium258

+0

はい!それは実際に実行命令でした....私は問題を見つけました:コンストラクタ内で自分のプロパティにアクセスしようとすると、外部に置かれた値やDesignプロパティエディタを使用しないため、オブジェクトが準備できていませんその時点で。ああ、愚かな私!他の方法でプロパティにアクセスしようとすると、そのプロパティが機能します。みんなありがとう!私は昼寝しました。 – litium258

0

引用符で囲まれたコードは問題にはなりません。 ColorStripの同じインスタンスを参照していますか?また、.Designer.csファイルをチェックして、プロパティを設定するコードが存在することを確認します。

実際には、自動実装プロパティを使用して、コードを単純化してみてください。

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

public ColorStrip() { ... clusterSize = 20; ... } 
関連する問題