- - PR -
ASP.NET2.0 WEBカスタムコントロールについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-05-22 17:13
oka a.k.a shuと申します。
VS2005のVBでWEBカスタムコントロールを作成していますが プロパティが入力された時のエラーチェックを入れる場所に困っています。 例えば・・・ Public Overridable Property MaxValue() As Decimal Get Return _MaxValue End Get Set(ByVal value As Decimal) ・・・ここにチェック処理・・・ _MaxValue = value End Set End Property Public Overridable Property MinValue() As Decimal Get Return _MinValue End Get Set(ByVal value As Decimal) ・・・ここにチェック処理・・・ _MinValue = value End Set End Property 必ず、MaxValue >= MinValueという条件があった場合に 各プロパティのSetでチェックを行うと、デザイナ上では期待通りの結果が返ってくるのですが 実行した時に、正しい値が取得できず、正しくチェックができないことがわかりました。 この様なチェックの場合、どこに入れるのが正しいのでしょうか? また、現在、エラーを知らせるために Throw New SystemException を使用していますが、この様な方法で良いのでしょうか? お解かりの方いましたら、ご指導よろしくお願い致します。 | ||||
|
投稿日時: 2008-05-22 19:01
チェック処理とは、具体的に何をしているのでしょう?
また、実行時に、どんな値になっているのでしょう? 何が起こっているかを正確に把握しないと、問題は解決できないと思います。 で、例外は ArgumentException のほうがいいと思います。あるいは、範囲外というのもあったかも? | ||||
|
投稿日時: 2008-05-22 19:57
先に MinValue から値を設定するのか、MaxValue から設定するのかでチェックルーチンは変わりませんか?
プロパティの設定する順序には期待は持たないのが、プロパティのお作法かなと思います。 従って、その手のものは、メソッドにして療法同時に値を設定するか、実際に MinValue と MaxValue を参照するコードまで評価を遅延してもいいんじゃないでしょうか。 | ||||
|
投稿日時: 2008-05-22 21:49
Jittaさん、囚人さん、返信ありがとうございます。
>チェック処理とは、具体的に何をしているのでしょう? If Me.MaxValue < Me.MinValue Then Throw New SystemExeption End If MaxValueとMinValueのプロパティを見て比較しています。 >また、実行時に、どんな値になっているのでしょう? 囚人さんがおっしゃったとおりなのですが デザイナで、MinValue⇒MaxValueの順にプロパティを設定すると <cc1:ccText ID="ccText1" runat="server" MinValue="5" MaxValue="10" ...> の様な感じでソースが出力されます。 これを実行すると、MinValueからSetされていくので MinValueのSet内でチェックを行うと、MaxValueはまだSetされていないため MaxValueは10ではなく、初期値が取得されてしまい、正しく評価できないということです。 >例外は ArgumentException のほうがいいと思います。あるいは、範囲外というのもあったかも? ありがとうございます。私の方で詳しく調べてみたいと思います。 >実際に MinValue と MaxValue を参照するコードまで評価を遅延してもいいんじゃないでしょうか。 私もそう思いまして「Render」ならばと、チェック処理を行ってみたのですが デザイナ上でエラーになると、アラートが出ずに灰色の枠になってしまいました。 Render内でエラーを出したので、コントロールの表示に失敗したとなるみたいです。 Render以外で、各プロパティに設定された値が正しく参照できる部分はあるのでしょうか? | ||||
|
投稿日時: 2008-05-24 20:30
初期値として 0 とか、その型の最小、最大値を設定しておくとか。
あるいは、Nullable にしておくとか。 http://msdn.microsoft.com/en-us/library/system.argumentoutofrangeexception.aspx ArgumentOutOfRangeException | ||||
|
投稿日時: 2008-05-25 10:45
囚人さんの言われているのは、別メソッドで必要な時にチェックすれば よいの意味かと思われます。 (Renderは必要な時では無いと思います。 必要な時を考えたほうがよいかと。。。 必要な時は両方そろっているかと。。。) | ||||
|
投稿日時: 2008-05-25 19:17
Jittaさん、indigo-xさん返信ありがとうございます。
Jittaさんの「その型の最小、最大値を設定しておくとか」で 対処することになりました。 ありがとうございました。 |
1