- PR -

ユーザーコントロールの作り方2 (追加したプロパティの値をデフォルトにする方法)

投稿者投稿内容
ポポロン
常連さん
会議室デビュー日: 2003/05/30
投稿数: 26
投稿日時: 2004-06-11 16:42
いつもお世話になっております。

過去スレのユーザーコントロールのプロパティ追加で触れていることなのですが、
デフォルトの値が「Nothing」の場合はデフォルト値になりません。
ShouldSerializeValueメソッドを使ってもなりません。
ControlクラスやStringクラスのデフォルト値を「Nothing」にしたいのですが、
どうしたらいいいのでしょうか?
ちなみに、Stringクラスのデフォルト値を
「""」もしくは、「DBNull.Value.ToString」
とした場合はできました。

よろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-06-11 17:02
String.EmptyでなくNothingにしたいのはなぜでしょうか?
そもそもクラスにNothingを設定してしまったら
PropertyGridから値を設定できなくなってしまいます。
PropertyGridがそのインスタンスをNewしてくれるわけではないので。。。。
ポポロン
常連さん
会議室デビュー日: 2003/05/30
投稿数: 26
投稿日時: 2004-06-11 17:40
返信ありがとうございます。
Stringクラスについてはどうでも良かったんですが、
Controlクラスのデフォルト値を(なし)にしたいのです。
当然、Control.Emptyなんて便利な値はないもので…
よって、Nothingで記述してみたにすぎないので、
他に方法があったら教えてください。
よろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-06-12 01:39
Controlクラスとは何でしょうか?
自作したクラスですか?
そのクラスをデザイナから編集させたいのなら
デフォルト値を自分で決めても問題ないのではないでしょうか。
デザイナで編集させたくないのならBrowsableをFalseにすればいいと思います。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-06-12 12:16
普通にやっただけで (なし) と Formに存在するコントロールが選択できましたが・・・
コード:

[Description("Controlです。"),Category("設定")]
public Control Control
{
get
{
return this._Control ;
}
set
{
this._Control = value ;
}
}


<追記>
初期値はコンストラクタでヌルってます。
_Control = null

今試したら以下のコードもつけられました。
[System.ComponentModel.DefaultValue(null)]


[ メッセージ編集済み 編集者: えムナウ 編集日時 2004-06-12 15:29 ]
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-06-12 15:44
string もいけましたが、一度値を入れて消すと "" で設定されるようです。
コード:
[Description("Stringです。"),Category("設定")]
[DefaultValue(null)]
public string String 
{
	get 
	{
		return this._String ;
	}
	set
	{
		this._String = value ;
	}
}

ポポロン
常連さん
会議室デビュー日: 2003/05/30
投稿数: 26
投稿日時: 2004-06-12 15:50
burton999さん、こんにちは。
・Controlもクラスの一つではないのですか?
・プロパティをデザイン時でも設定したいので、「BrowsableをFalse」は駄目なんです。

えムナウさん、こんにちは。
VB.NETでは「null」が使えません。変わりに「Nothing」を使うので…
解決策が無いなら、C#でユーザーコントロールを作った方がいいのでしょうか・・・
当然、デフォルト設定を行いたいので、
System.ComponentModel.DefaultValueも
Private Function ShouldSerializeValueメソッドも
両方試しています。

追記内容かもしれませんが、なぜ、デフォルト値にしたいのかと言いますと、
デザイン画面でこのプロパティが最初から太字になっているのです。
これだと、「InitializeComponent」メソッド内に余計なコードが増えてしまいます。
ユーザーコントロールを貼り付ける数は数個なら気にならない行数でしょうが、
100ぐらいになると、これだけで、100行増えてしまいます。

基本的に、プロパティ値はデザインで行うのではなく、プログラムによって制御しているので、
必要のないプロパティはデフォルトのままにしておきたいのです。
しかし、ユーザーコントロールなので、汎用性があるように作りたい・・・
ということなのです。

なんだか、偉そうな事を述べていますが、良き知恵をお貸しください。
よろしくお願いします。
ポポロン
常連さん
会議室デビュー日: 2003/05/30
投稿数: 26
投稿日時: 2004-06-12 19:05
C#で簡単にプロパティの部分だけ作ってみましたが、
やはり、デフォルト設定値にnullが使えますね…
こんなところで、VBとC#の違いが出てくるとは…

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