- PR -

System.ComponentModel.DefaultValueについて

投稿者投稿内容
.net
ベテラン
会議室デビュー日: 2005/04/11
投稿数: 95
投稿日時: 2006-12-27 10:51

いつも、お世話になっております。

現在、Vb.net2003にてWindowsアプリの開発を行っております。

現在Windows.Forms.Labelを継承した派生コントロールを作成し、下記のような追加プロパティを定義しております。

------------------------------------------------------------------------------

Private _test As Integer
<System.ComponentModel.DefaultValue(UseModeKind.Normal)> _
Public Property test() As UseModeKind
Get
Return _test
End Get
Set(ByVal Value As UseModeKind)
_test = Value
End Set
End Property


#Region " 列挙体"

Public Enum UseModeKind As Integer
Normal = 0
FieldNameLabel = 1
End Enum

#End Region
------------------------------------------------------------------------------

そこで、質問なのですが、上記プロパティでは確かに「<System.ComponentModel.DefaultValue(UseModeKind.Normal)> 」を宣言しているのですが、どうしてもInitializeComponent メソッド内で初期化されるコードが記述されてしまいます。

ちなみに、プロパティの型を列挙体(Enum)で無くした所、初期化コードは記述されませんでした。

上記のようにプロパティの型を列挙体(Enum)にすると、初期化コードは必ず記述されてしまうものなのでしょうか?

それとも、その他原因が考えられるのでしょうか?

どうか、よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-27 11:20
引用:

.netさんの書き込み (2006-12-27 10:51) より:

そこで、質問なのですが、上記プロパティでは確かに「<System.ComponentModel.DefaultValue(UseModeKind.Normal)> 」を宣言しているのですが、どうしてもInitializeComponent メソッド内で初期化されるコードが記述されてしまいます。


そもそも、この書き方ですと、プロパティ ウィンドウの該当のプロパティで、
[リセット] する時に IDE から変換できないと叱られてしまいませんか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
.net
ベテラン
会議室デビュー日: 2005/04/11
投稿数: 95
投稿日時: 2006-12-27 11:28
引用:

じゃんぬねっとさんの書き込み (2006-12-27 11:20) より:
引用:

.netさんの書き込み (2006-12-27 10:51) より:

そこで、質問なのですが、上記プロパティでは確かに「<System.ComponentModel.DefaultValue(UseModeKind.Normal)> 」を宣言しているのですが、どうしてもInitializeComponent メソッド内で初期化されるコードが記述されてしまいます。


そもそも、この書き方ですと、プロパティ ウィンドウの該当のプロパティで、
[リセット] する時に IDE から変換できないと叱られてしまいませんか?




早速のご返答ありがとうございます。

[リセット] といった行為がよくわかっていないのですが、
デザイナ画面のプロパティウィンドウで、値をBackSpace等にて消すといった行為という認識でよろしかったでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-27 11:42
引用:

.netさんの書き込み (2006-12-27 11:28) より:

[リセット] といった行為がよくわかっていないのですが、


System.Component.DefaultValue 属性の存在意義について理解されていますか?

DefaultValue 属性は、ビジュアル デザイナを助けるために存在しています。
そして、[リセット] はビジュアル デザイナの機能です。

引用:

デザイナ画面のプロパティウィンドウで、値をBackSpace等にて消すといった行為という認識でよろしかったでしょうか?


該当のプロパティに対して 「コンテキスト メニュー」 を表示させてみてください。

ここで [リセット] したプロパティは、コード ジェネレータによって、
初期化用のメソッド (InitializeComponent メソッド) から記述が削除されます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
.net
ベテラン
会議室デビュー日: 2005/04/11
投稿数: 95
投稿日時: 2006-12-27 11:58
返答ありがとうございます。
知識が乏しくご迷惑をお掛けしております。

引用:

じゃんぬねっとさんの書き込み (2006-12-27 11:42) より:
引用:

.netさんの書き込み (2006-12-27 11:28) より:

[リセット] といった行為がよくわかっていないのですが、


System.Component.DefaultValue 属性の存在意義について理解されていますか?

DefaultValue 属性は、ビジュアル デザイナを助けるために存在しています。
そして、[リセット] はビジュアル デザイナの機能です。

引用:

デザイナ画面のプロパティウィンドウで、値をBackSpace等にて消すといった行為という認識でよろしかったでしょうか?


該当のプロパティに対して 「コンテキスト メニュー」 を表示させてみてください。

ここで [リセット] したプロパティは、コード ジェネレータによって、
初期化用のメソッド (InitializeComponent メソッド) から記述が削除されます。




確かに、追加したプロパティに関してはリセットがグレイアウトになっていて出来ませんでした。
当方の思いとしてはTextAlignプロパティのように、選択式でリセットできるような
プロパティにしたかったのですが、そのようなプロパティの作成にはロジック不足だと言う事でしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-27 12:11
引用:

.netさんの書き込み (2006-12-27 11:58) より:

確かに、追加したプロパティに関してはリセットがグレイアウトになっていて出来ませんでした。


グレーアウトになっているというのは、私の予想に反していますね。
値を一旦、Normal 以外に変えて実行してみてください。

引用:

当方の思いとしてはTextAlignプロパティのように、選択式でリセットできるような
プロパティにしたかったのですが、そのようなプロパティの作成にはロジック不足だと言う事でしょうか?


これに関しては、本題とは別のお話です。

列挙体を使用していれば DropDownList による選択で値を選ぶことができますが、
TextAlign プロパティのような独自のビジュアルつきとなると、本題からそれます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
.net
ベテラン
会議室デビュー日: 2005/04/11
投稿数: 95
投稿日時: 2006-12-27 13:00
たびたびの、ご返信ありがとうございます。

引用:

じゃんぬねっとさんの書き込み (2006-12-27 12:11) より:

グレーアウトになっているというのは、私の予想に反していますね。
値を一旦、Normal 以外に変えて実行してみてください。




Normal以外でも、リセットがグレイアウトとなっていました。

引用:

じゃんぬねっとさんの書き込み (2006-12-27 12:11) より:

列挙体を使用していれば DropDownList による選択で値を選ぶことができますが、
TextAlign プロパティのような独自のビジュアルつきとなると、本題からそれます。



すみません、TextAlignまでは言いすぎました。
ビジュアルは不要です。選択式となってなっていればOKです。

本題として、列挙体の場合、初期化コードには必ず記述されてしまうのでしょうか?
もう少し、調査してみます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-27 13:11
引用:

.netさんの書き込み (2006-12-27 13:00) より:

Normal以外でも、リセットがグレイアウトとなっていました。


おそらくですが、

引用:

Private _test As Integer


ここが原因かと思われます。

ダメですよ... これでは...
プロパティの Getter と Setter でも、暗黙の型変換が発生していますし...

_test の '型' をプロパティの戻り値の型に合わせてあげてください。

引用:

本題として、列挙体の場合、初期化コードには必ず記述されてしまうのでしょうか?


これに関しては、DefaultValue 属性の書き方が悪いと思います。
とりあえず、

コード:

    <System.ComponentModel.DefaultValue(GetType(UseModeKind), "Normal")>


あたりで試してみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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