2009-05-31 14 views
2

デザイナで設定されたカスタムプロパティを使用してユーザーコントロールを作成しようとしています。ただし、コントロールには実行時に調整しないでください。デザイナーコードによって最初に設定された後に値が変更されるのを止める方法はありますか?実行時にC#のプロパティが停止する

答えて

6

プロパティ定義を変更できますか?一つのアプローチは、プロパティセッターにセンチネルを追加し、(通常のInitializeComponent(によって行われることになる))のみ一組の操作を可能にする、ある:

private int _myProperty; 
private bool _isMyPropertySet = false; 
public int MyProperty 
{ 
    set 
    { 
     if (!_isMyPropertySet) 
     { 
      _isMyPropertySet = true; 
      _myProperty = value; 
     } 
     else 
     { 
      throw new NotSupportedException(); 
     } 
    } 
} 
+0

実際、これは私の解決策よりもきれいです。+ +1 – Kazar

+0

これは私が使用しようと考えている方法です。私はちょうど私が言語に組み込まれた何かを見逃している可能性があり、ベストプラクティスを使いたいと思っていました。 – PeteT

+0

あなたがラップしているコントロールについてもっと知ることなく、私が考えることのできるものは何もありません。それを知っていても、私は多分助けにはならないでしょうが、他の誰かが... –

1

プロパティ設定ツールで例外をスローできますか?

public int SomeProperty { 

    set { 

     if(designerComplete) { 
      throw new IllegalOperationException(); 
     } 

    } 

} 

designerCompleteをクラス変数に設定します。これは、InitializeComponentメソッドがコンストラクタで呼び出された後にtrueに設定されます。

+0

これは、デザインモードであるかどうかを確認するためのチェックを追加した場合にも有効です。 –

+0

コードがフォームデザイナ内で実行されている場合は#defineセットがありますか?もしそうなら、それはおそらく行く方法でしょう。 – Kazar

+1

@ Kevin:petebob796は、実際にデザイナーコードを意味するものではなく、フォームデザイナーで設定された値にプロパティを設定するInitializeComponentのランタイム呼び出しを意味します。そして、デザインモードをチェックすることで、彼が望むことはできません。 –

1

リサイズアーキテクチャはコードかどうかをテストするための内蔵方法を提供します現在デザインモードで実行されています - Component.DesignModeプロパティ。

だから、おそらくこのような実装で何かしたい:

private int _foo; 

public int Foo 
{ 
    get { return _foo; } 
    set 
    { 
     if (this.DesignMode) 
      throw new InvalidOperationException(); 

     _foo = value; 
    } 
} 
+1

これは正解ですが、DesignModeプロパティはユーザーコントロール上で直接利用できるため、サイトに行く必要はありません。 – benPearce

+0

DesignModeはあなたが思う通りのことをしません。フォームがVisual Studioデザイナーからロードされている場合はtrueを返します。実行時に "デザイナーが作成した" InitializeComponent()内からフォームがロードされると、falseを返します。 OPが関心を持っているのは後者です。 –

+0

@マイケル:それは本当ですか?私は前にこのアプローチを同じ目的のために使ってきました。そして、それは絶対にうまくいっています。 – Noldorin

2

マイケルは偉大な答えを提供し、それは実行時に、あなたの問題を解決しますが。ただし、設計時に、その値を2回以上変更する必要がある場合(設計時間であり、確率が高い可能性が高い場合)、DesignModeチェックとMichaelsの例を組み合わせることをお勧めします。

private int _myProperty; 
private bool _isMyPropertySet = false; 
public int MyProperty 
{ 
    set 
    { 
     if (this.DesignMode || !_isMyPropertySet) 
     { 
       _isMyPropertySet = true; 
       _myProperty = value; 
     } 
     else 
     { 
       throw new NotSupportedException(); 
     } 
    } 
} 

これで、NotSupportedException()を実行して、2番目のセットで不具合のあるデザイナを取得することなく、この値をデザイン中にハートのコンテンツに編集することができます。

+0

はい、DesignModeに関するすべての議論の後、それはそのセッターにとって重要なものです。 –

関連する問題