なぜ私のコントロールのプロパティがクラスの外で変化しないのですか?
-
10-10-2019 - |
質問
私はC#が初めてですが、コーディングは初めてではありません - ほぼ20年間それを行うこと - そして、パネルから継承するカスタムコントロールのプロパティに問題があります。プロパティを置くと、デザイナープロパティリストに表示され、設定することもできますが、小さなアプリケーションを実行すると、これらのプロパティ値は使用されていないようです。プロパティをプログラムで変更する場合も同じです。エラーはありませんが、コントロールは何もしません。適切に設定されていないようです。ただし、クラスでプログラム的に行うと、彼らは機能します。私の推測では、私のプロパティの何かが設定/取得物が正しくないということです。私がそれをしている方法の次のコードチャンクをご覧ください:
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」として設定したとしても、デフォルトではなく、外部から変化することはありません。何か案は?メソッドのいないことは、新しい外部から解決されたプロパティの価値を取得しません。明らかに、ゲッター/セッターのものが機能していません。私には私が自分のプロパティを設定したり取得したりして正しくやっていないようです 外側 クラス。それは魅力としてその中でのみ機能します...どんな助けも...非常に感謝しています!
乾杯
リチウム
PSソリューションを明確にする:
この場合、プロパティを設定します コンストラクター内で新しいセット値を使用しようとしていたので機能しませんでした, 、それは物事を構築するのはまあ、新しい値を得ることができないようです。もし私が プロパティ値を変更します デザインモード>プロパティエディターまたはオブジェクトの外部コードでは、親フォームのロードイベントで、 それはそれを変更しますが、コンストラクターを除くすべての方法で読みやすい、 もちろん :)
解決
それはおそらく実行順序の問題です。プロパティセッターは変数を設定するだけですが、実際には、この変数に関連する状態を更新するためにコントロール上の何もトリガーしません(例:私が想定するボタンの追加または表示)。
プロパティを設定すると、初期化の残りの部分が完了すると、値が使用されています。そうしないと、最初のGOの間にデフォルト値がまだプロパティ値であるためではありません。
あなたはセッターで行動する必要があります、ここに説明するためのいくつかの擬似コードがあります:
set {
_showButtons = value;
if (alreadyInitialized) {
UpdateButtons();
}
}
注:最初に値を設定し、次に行動するようにしてください - それ以外の場合は、古い値を使用することになります(ちょうどあなたのように Console.Write()
やっている)。
他のヒント
引用されたコードは問題に見えません。 ColorStripの同じインスタンスを参照していると確信していますか?また、.designer.csファイルを確認して、プロパティを設定するコードがあることを確認してください。
実際、自動実装プロパティを使用してコードを簡素化してみてください。
public int clusterSize { get;set;}
public Boolean showButtons {get;set;}
public ColorStrip() { ... clusterSize = 20; ... }