2012-10-24 28 views
6

可能性の重複:
Setting the default value of a DateTime Property to DateTime.Now inside the System.ComponentModel Default Value Attrbute設定デフォルト値

イムカレンダーなどのコントロールを作成する、と私は、ユーザーが、彼らが見たいデ年を設定します。 しかし、そうでない場合、SelectedYearのプロパティは実際の年でなければなりません。

私はこのように、このデフォルト値を設定してみてください:

[DefaultValue(DateTime.Today.Year)] 
public int SelectedYear{ 
    get{ 
     return _selYear; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

そして、私はまあ、誤差がかなり明確で、次のエラー

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type 
+0

これはその属性のためのものではありません。クラスのデフォルトのctorにデフォルトのプロパティ値を設定することは、一般的なオプションの1つです。 – asawyer

+0

これはデザイナのデフォルト値です。つまり、コントロールに指定された年の値がある場合、値はプロパティウィンドウで太字になりません。プロパティ値には影響しません。 –

+0

コントロールを構築している場合は、コンストラクターのデフォルト値を設定するとよいでしょう。 – jags

答えて

6

DateTimeのプロパティは計算値ですが、バイナリに格納されている不変の値である属性に埋め込みしようとしています。これらの2つの概念は互換性がありません。

ここでやりたいことは、値がまだ設定されていないことに注意し、その場合は現在のYearを返すことです。それは毎年変わるので、これは、NULL可能

int? _selYear; 
public int SelectedYear { 
    get { return _selYear ?? DateTime.Today.Year; } 
    set { 
    _selYear = value; 
    UpdateCalendar(); 
    } 
} 
0

を得た:

属性引数を定数式でなければなりません...

の場合、実際のデフォルト値は何ですか?さて、コードをコンパイルした年になります。おそらくあなたが望むものではないでしょう。

実際に現在の年をデフォルトで戻したい場合は、コンストラクタの初期値に初期化するだけです。

ない set backing fieldではなく、コンストラクタで、次のようになぜ
0

- ユーザーがそれを設定していない場合

_selYear = DateTime.Today.Year 

それは、常にdefault値になります。

0

DateTime.Today.Yearが一定値ではなく、使用するのに適した場所です。あなたは_selYearがこれを使用して指定されているかどうかをチェックすることができ:

public int SelectedYear{ 
    get{ 
     if (_selYear.Equals(0)){ 
      return DateTime.Today.Year; 
     } 
     else{ 
      return _selYear; 
     } 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

これは、あなたがDefaultValueが一定の値だけを受け入れるので、これは0です。

0

に_selYearを開始し検討しています。次のような別の方法でこれを行うことができます

public int SelectedYear{ 
    get{ 
     return _selYear == 0 ? DateTime.Now.Year : _selYear; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

希望があれば幸いです。

1

プロパティの値を明示的に初期化する必要があります。 DefaultValue属性は、値がデフォルトであるメタデータを提供するだけの値でプロパティを初期化しません。

タイプのctorで初期化することも、タイプを反映するカスタムコードを作成して、タイプメタデータの値でプロパティを初期化することもできます。

3

AmbientValueAttributeを使用して、プロパティをデフォルト値に設定すると、実際に現在の日付を取得することを示します。

int _selYear = 0; 

[AmbientValue(0)] 
[DefaultValue(0)] 
public int SelectedYear{ 
    get{ 
     if (_selYear == 0) 
      return DateTime.Today.Year; 
     return _selYear; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

あなたは0の値を使用する場合は、あなたはそれがNULL可能せるが、nullを返すことはできません、唯一のヌルを設定することができ:

int _selYear = null; 

[AmbientValue(null)] 
[DefaultValue(null)] 
public int? SelectedYear{ 
    get{ 
     return _selYear ?? DateTime.Today.Year; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

今、それが表すNULL値であります今年

AmbientValueAttributeの意味:このプロパティをその値に設定した場合、プロパティを取得したときに環境から別の値が返され、その場合の戻り値が現在の日付と同じになることがあります。

関連する問題