DOBON.NET DOBON.NETプログラミング掲示板過去ログ

継承したTextBoxで

  • 題名: 継承したTextBoxで
  • 著者: medaka
  • 日時: 2004/12/03 11:06:39
  • ID: 7809
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[VB.NET XPProSP2]
分類:[.NET]

ユーザーコントロールで継承したTextBoxを作りました

Private _text As String

<System.ComponentModel.DefaultValue("")> _
Public Overrides Property Text() As String
Get
Return _text
End Get
Set(ByVal Value As String)
_text = Value
End Set
End Property

Textプロパティの初期値を””としたかったので上記のようにし、
デザイナのツールボックスに登録後、フォームにDrag&Dropすると
Textプロパティにはコントロール名が入ってしまいます
デザイナで追加した時にTextプロパティの値を指定するのは別の
方法でしないといけないでのでしょうか?
■No7809に返信(medakaさんの記事)
> Textプロパティの初期値を””としたかったので上記のようにし、
> デザイナのツールボックスに登録後、フォームにDrag&Dropすると
> Textプロパティにはコントロール名が入ってしまいます
> デザイナで追加した時にTextプロパティの値を指定するのは別の
> 方法でしないといけないでのでしょうか?

初期値はコンストラクタで、設定すべき。
DefaultValue アトリ は「リセット」を選択した時に戻す値。

混同しちゃイケマセン。
> 初期値はコンストラクタで、設定すべき。
> DefaultValue アトリ は「リセット」を選択した時に戻す値。
>
> 混同しちゃイケマセン。

継承TextBox内のNewコントラクタで Mybase.Text="" としてみたのですが
やはりデザイナで新規コントロールを貼り付けると
コントロール名がTextプロパティにセットされています

FormのNewコントラクタじゃないですよね?
■No7817に返信(medakaさんの記事)
> 継承TextBox内のNewコントラクタで Mybase.Text="" としてみたのですが
> やはりデザイナで新規コントロールを貼り付けると
> コントロール名がTextプロパティにセットされています

私の説明が悪かったようで申し訳ないです・・・。
新規でコントロールを貼り付けた時の動作は、IDEの仕様な気がしますが。

> FormのNewコントラクタじゃないですよね?

追加した後、Textプロパティがどう初期化されるかを考えれば。
そもそも、そんなに鬱陶しいことですか?
全部選択して、Text → Del だけですが・・・。
■No7818に返信(java.lang.Nullpoさんの記事)
> ■No7817に返信(medakaさんの記事)
>>継承TextBox内のNewコントラクタで Mybase.Text="" としてみたのですが
>>やはりデザイナで新規コントロールを貼り付けると
>>コントロール名がTextプロパティにセットされています
>
> 私の説明が悪かったようで申し訳ないです・・・。
> 新規でコントロールを貼り付けた時の動作は、IDEの仕様な気がしますが。
>
>>FormのNewコントラクタじゃないですよね?
>
> 追加した後、Textプロパティがどう初期化されるかを考えれば。
> そもそも、そんなに鬱陶しいことですか?
> 全部選択して、Text → Del だけですが・・・。

IDEの仕様なのかな?
他のコントロールも同様にcontrol.Text=control.nameになってますしね

仮にコントロールが100個あれば全部Textプロパティを消してあげないといけない
わけで、オブジェクト自身の初期化はオブジェクトにまかせるのがすっきりする
のではないかと思いました

ご返答ありがとうございました
Nullpoちゃんは、人を見下すのが大好きなんですよねぇw
興味があったので調べてみました。< IDE の仕様で納得できなかった捻くれ者の私(^_^;)


 適当なキーワードでぐぐったところ、

ControlのTextプロパティの初期値について
http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=15110

というやり取りがみつかりました。で、この内容を切っ掛けに辿り着いたのが次のページです。

.NET Framework Visual Designers におけるコード生成のカスタマイズ
http://www.microsoft.com/japan/msdn/net/general/custcodegen.asp

 ざっと目を通した感じ、 CodeDomSerializer を継承したクラスを作成して DesignerSerializer 属性に設定あげればお望みのことはできそうです。
 未検証なので上手くいかないかも知れませんけど、試して結果を報告して頂けると嬉しいです(^^)
■No7824に返信(通りすがりさんの記事)

私もこの掲示板でご質問に対して回答を書くときに、それが読み手の方や質問者の方を不快にさせやしないかと心配し気を使っていますが、回答という性格上、多少えらそうな言い方になってしまうのはやむを得ず、現実にはすべての方に好印象を与える文章を書くのというのは至難の業といえます。しかしだからといって、気を使いすぎるととても回答など書けなくなります。この掲示板はみなさん善意で回答を書いてくださっているので、回答にかける時間も取れないでしょうから、なおさらといえます。

「通りすがりさん」はいままで回答を書いてくださったことがあるのか分かりませんが、もしなければ、回答者の立場も考えてみてください。一度でも回答を投稿していただければその難しさが分かると思います。もし回答を書いたことがあるのであれば、ぜひ参考にさせていただきたいので、どのような文章をお書きになったのか読ませてください(「通りすがりさん」のこの投稿を拝見する限り、これはなさそうですが)。

誤解しないでいただきたいのは、私は質問者はどんな内容の回答であっても回答者に感謝しろと言うつもりは全くありません。不愉快な言葉遣いや内容の回答であれば、回答者はそのことを指摘されても仕方がないでしょう。ただしその場合でも、あなたが回答者に求めるようにあなた自身の返信も相手を傷つけるようなものであってはいけないというのは当然ではないでしょうか。

#この記事への返信は「お気楽掲示板」の方へお願いいたします。

#この投稿は明らかにマナー違反ですが、投稿者は承知の上だと思いますので、このことは言うだけ無駄と判断しました。
お返事遅くなりすいません。
MSのリンク先の記事後半のCodeDOMやシリアライズはちょっと私には理解不能でしたが前半は勉強になりました。
属性の2-3行程度ではTextプロパティの規定値は変更できないみたいですね。
情報ありがとうございました
2005/01/05(Wed) 13:40:26 編集(投稿者)

 試しては頂けなかったようで少し残念です。とは言え、的外れな内容だったようなので良かったかも(汗)

 実験してみましたが、先の内容では駄目でした。
 考えてみたら当たり前ですよね。デザイン時の設定をシリアル化するもので初期値に干渉などできる筈もなく‥‥いや、お恥ずかしい(///)


 ここで退くのはなんとなく悔しかったので、更に調べてみました。
 どうやらデザイナの動作を変更するには Designer 属性を指定してあげれば良いようです。そして TextBox クラス(というか Control クラス)には ControlDesigner クラスが設定されていて、この OnSetComponentDefaults メソッドで Text プロパティの設定を行っているとのこと。

ControlDesigner.OnSetComponentDefaults メソッド
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsdesigncontroldesignerclassonsetcomponentdefaultstopic.asp

 そこで ControlDesigner の継承クラスを作成し OnSetComponentDefaults メソッドをオーバーライド、中身を空としたところ要件を満たすことができました♪
 もしまだ必要とされてるようでしたらお試しくださいませ。
#ただ、配置直後から見かけ上識別できなくなってしまうので、個人的には使い難かったです(^_^;)<慣れの問題もあるでしょうけど



<まとめ(?)>
・初期値と規定値は別ものである(イコールとは限らない)
・初期値はコンストラクタで設定する
・規定値は DefaultValue 属性で指定する
・デザイナでコンポーネントを作成したとき、デザイナによって初期値が与えられることもある
・デザイナの機能はカスタマイズ可能である(下記参照)

.NET コンポーネントのためのカスタム デザイナの作成
http://www.microsoft.com/japan/msdn/net/general/custdsgnrdotnet.asp



#一月近く前のスレッドを上げるほどの内容じゃないと思うのでこっそり追記(^_^;)

 質問を四角四面に受け取ったため、先のようにデザイナをカスタムする方法を紹介しました。しかし、要件的には DesignerSerializationVisiblity 属性に Hidden を設定するだけで十分だったのかも知れません。
 この方法ではコントロールを配置したときに Text プロパティが設定されてしまいますが、デザイナのデシリアライズが発生した時点で初期値となりますから(コード生成されてないので)。
#勿論、デザイン画面上で Text プロパティの設定をすることができなくなります−正確には設定した値が保存されなくなる、でしょうか−けど。
何度もありがとうございます
さっそく試してみました

Public Class ControlDesignerEx
Inherits System.Windows.Forms.Design.ControlDesigner
Public Overrides Sub OnSetComponentDefaults()
End Sub
End Class

上記のコードをTextBox継承コントロールの中に置いてみたのですが
動作変わらず駄目でした
何かコードが足らないような気がします・・・
#言葉端折ったの不味かったかなぁ(汗)


> 上記のコードをTextBox継承コントロールの中に置いてみたのですが
> 動作変わらず駄目でした
> 何かコードが足らないような気がします・・・

 TextBox を継承したクラスの Designer 属性に、作成した ControlDesignerEx は指定されてますでしょうか?
↓例えばこんな感じで

<System.ComponentModel.Designer(GetType(ControlDesignerEx))> _
Public Class TextBoxEx
    Inherits System.Windows.Forms.TextBox


 エラーは出てないようですし System.Design.dll を参照設定してないわけではないのですよね。
リビルドも行っているのでしたら、私にはちょっと原因が判りません‥‥。
  • 題名: Re[10]: 継承したTextBoxで
  • 著者: medaka
  • 日時: 2004/12/09 15:55:42
  • ID: 7969
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
う、属性の設定はしていませんでした。
ご指摘どおり属性指定してやれば思い通りの動作になりました。
何度もありがとうございました。

思い通りのTextBox作るのって難しいですね
まだまだ難題山積みです

DOBON.NET | プログラミング道 | プログラミング掲示板