日記
.netメモ「Colorをプロパティで使う」Edit

VisualBasic.NETのカスタムコントロールなどでColorをプロパティとして使う場合のTIPS。

VisualBasic.NETでは、色要素はColor型の構造体(でもColor型にはメソッドがあるよ。これってClassなんじゃないの? VisualBasic.NETの構造体って特殊なのか?)として利用される。構造体なのでNewする必要はない。初期化は「Color.FromName(色名)」なんて感じで行う。

プロパティをColor型として宣言しておけば、自動的にColor型としてコードに組み込まれるので、それをそのままwebコントロールのColor系プロパティに代入(したり、フロント側で「色プロパティ='<%# 色プロパティ名 %>'」と書いたり)することができる。しかし、.netの世界ではColor型が標準かもしれないが、.netの世界で完結してwebアプリケーションを作るのは難しい。なんかかんか言って、昔ながらのaspみたいにhtmlタグをハードコードする必要が頻繁に出てくる。

で、そういうときにはColor型プロパティをhtmlタグに文字列として埋め込む必要が出てくる。そういう場合、「Color.ToString」としたくなるけど、これは間違い。「Color.Name」って表現の方が、html的な意味での色を表現する文字列となる。フロント側で「<%# 〜 #>」を使って、いろんなプロパティに値を埋め込む場合、webコントロール系のプロパティにはColor型のプロパティを直接「<%# Color #>」なんて埋め込むことができるが、htmlタグのプロパティ部には「<%# Color.Name #>」と書かないと意図した色にならない(具体的には「Color {色名}」なんて文字列になってしまう)。

同様にFontSizeみたいなプロパティもIntじゃなくてFontUnit型Classとして扱わなければいけなかったりする。htmlタグと混在してwebコントロールを利用するような場合は、意識しておかないと混乱するよ。

* 追記

と書いてからさらにいろいろやってみたところ、やっぱりプロパティとして直接Color型を用意するのはいろいろ問題があるな。今作っているコントロールでは、コントロールをパラメタライズする手段として、コントロールのプロパティに直接(あるいはコードから)指定する方法+XMLデータを使ってパラメタライズする方法、という二パターン用意しているんだけど、上記のやり方でうまくいくのは後者のXMLから文字列データを受け取って明示的に(コードで)Color型に変換してからプロパティをセットする場合だけだった。

Color型のプロパティを宣言して、直接プロパティに(aspxファイル内などで)Colorをセットしようとすると、うまくいかない。「Color="white"」なんてやったのではもちろん「"white"」はString型だから、暗黙の内にColor型に変換なんてできるわけもないのでエラーが出る。また、面倒くさく「Color='<%# System.Drawing.Color.FromName("white") %>」と書くと、エラーは出ない(内部的にはきちんと代入できている)にもかかわらず、なぜかコントロール側のコードでその値にアクセスできない。

というわけで、コントロールでColor型のプロパティを使いたい場合は、プロパティとしてはString型の「ColorS」なんてものを定義しておいて、さらにそれをColor型に変換するために

readonly property ColorC as Color
get
return Color.FromName(ColorS)
end get
end property

も用意し、文字列が欲しいときは「ColorS」、Color型が欲しいときは「ColorC」と使い分けたりするのが一番無難かも。

Published At2002-05-22 00:00Updated At2002-05-22 00:00