- PR -

ASP.NET2.0 WEBカスタムコントロールについて

1
投稿者投稿内容
oka a.k.a shu
会議室デビュー日: 2008/02/12
投稿数: 7
投稿日時: 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 を使用していますが、この様な方法で良いのでしょうか?

お解かりの方いましたら、ご指導よろしくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-05-22 19:01
チェック処理とは、具体的に何をしているのでしょう?
また、実行時に、どんな値になっているのでしょう?

何が起こっているかを正確に把握しないと、問題は解決できないと思います。



で、例外は ArgumentException のほうがいいと思います。あるいは、範囲外というのもあったかも?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2008-05-22 19:57
先に MinValue から値を設定するのか、MaxValue から設定するのかでチェックルーチンは変わりませんか?

プロパティの設定する順序には期待は持たないのが、プロパティのお作法かなと思います。

従って、その手のものは、メソッドにして療法同時に値を設定するか、実際に MinValue と MaxValue を参照するコードまで評価を遅延してもいいんじゃないでしょうか。
oka a.k.a shu
会議室デビュー日: 2008/02/12
投稿数: 7
投稿日時: 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以外で、各プロパティに設定された値が正しく参照できる部分はあるのでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-05-24 20:30
初期値として 0 とか、その型の最小、最大値を設定しておくとか。
あるいは、Nullable にしておくとか。

http://msdn.microsoft.com/en-us/library/system.argumentoutofrangeexception.aspx
ArgumentOutOfRangeException
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-05-25 10:45
引用:

oka a.k.a shuさんの書き込み (2008-05-22 21:49) より:
>実際に MinValue と MaxValue を参照するコードまで評価を遅延してもいいんじゃないでしょうか。
私もそう思いまして「Render」ならばと、チェック処理を行ってみたのですが
デザイナ上でエラーになると、アラートが出ずに灰色の枠になってしまいました。
Render内でエラーを出したので、コントロールの表示に失敗したとなるみたいです。
Render以外で、各プロパティに設定された値が正しく参照できる部分はあるのでしょうか?



囚人さんの言われているのは、別メソッドで必要な時にチェックすれば
よいの意味かと思われます。

(Renderは必要な時では無いと思います。
  必要な時を考えたほうがよいかと。。。
   必要な時は両方そろっているかと。。。)
oka a.k.a shu
会議室デビュー日: 2008/02/12
投稿数: 7
投稿日時: 2008-05-25 19:17
Jittaさん、indigo-xさん返信ありがとうございます。

Jittaさんの「その型の最小、最大値を設定しておくとか」で
対処することになりました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)