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

TextBox(自作)でスマートタグに表示される「MultiLine」の項目を非表示にしたい

環境/言語:[OS : Windows Vista Ultimate / 言語 : C# / .NET Framework : 2.0]
分類:[.NET]

2009/01/13(Tue) 00:20:56 編集(投稿者)

【解決したい問題】
自作したTextBoxのスマートタグをクリックしてアクションリストに表示される「MultiLine」の項目を非表示にしたい。

<具体的な説明>
開発言語 VS2005 C# (sp1適用)
Windowsコントロールライブラリで、TextBoxを継承した数値入力専用のコントロールを作成ししました。複数行には対応させたくないため、アクションリストからMultiLineの項目を非表示としたいのですが、実装方法がいまだに推測できません・・・。

【解決するために何をしたか】
参考URL
http://msdn.microsoft.com/ja-jp/library/ms171830.aspx
ヘルプを参考にしながら
・System.dll
・System.Windows.Forms.dll
・System.Design.dll
・System.Drawing.dll
を参照設定し、
・DesignerActionList から派生したクラスを実装
・ActionLists プロパティを実装するために関連付けられたデザイナ クラスを更新
とプログラムしビルドしました。結果は正常(エラー0、警告0)に終了しました。
実際に、Windowsフォームのデザイナで自作TextBoxを配置し、スマートタグをクリックすると、タスクのパネル内にMultiLineが表示されてしまいます。
何か見落とししている処理や間違いがきっとあると思い、何度もサンプルと見比べたのですが、情けないことに自分では気付けないようです。
あと、一通り過去ログも検索はしましたが、同じような投稿は見つけられませんでしたので、投稿させていただきました。

そもそも、標準のTextBoxで実装されているものを捻じ曲げるような使い方はできないものなのか、今の私には全く検討がつきません。
どなたか、似たような苦労をされた方など、ご教授いただけると幸いです。m(_ _)m
2009/01/13(Tue) 10:12:17 編集(投稿者)

■No23776に返信(ayami0429さんの記事)
> 自作したTextBoxのスマートタグをクリックしてアクションリストに表示される「MultiLine」の項目を非表示にしたい。

アクションリストは必要というのであれば、不要な DesignerActionMethodItem は
実装せず、必要な物だけを実装してください。
もしもアクションリストが不要なら、ActionLists で null を返すだけでも OK。
(実装しないからといって、NotImplementedException を投げるのは NG です)

-------------------------------------
[Designer(typeof(Class1Designer))]
public class Class1 : TextBox
{
 [Browsable(false)]
 [EditorBrowsable(EditorBrowsableState.Never)]
 public override bool Multiline
 {
  get { return false; }
  set { base.Multiline = false; }
 }

 public class Class1Designer : ControlDesigner
 {
  public Class1Designer() { }
  public override DesignerActionListCollection ActionLists
  {
   get { return null; }
  }
 }
}
-------------------------------------


> ・ActionLists プロパティを実装するために関連付けられたデザイナ クラスを更新
> とプログラムしビルドしました。
そのデザイナ クラスを、「TextBoxを継承した数値入力専用のコントロール」の
DesignerAttribute に割り当てていますか?


> そもそも、標準のTextBoxで実装されているものを捻じ曲げるような使い方はできないものなのか、今の私には全く検討がつきません。
できますが、System.Windows.Forms.Design.TextBoxBaseDesigner を始めとする
多くのデザイナは internal として設計されているため、面倒な事に、
System.Windows.Forms.Design.ControlDesigner から実装せねばなりません。
魔界の仮面弁士様へ
ayami0429です、返信が大変遅くなってしまい申し訳ございません。

非常にシンプルで分かりやすいサンプルコードまでご提供いただけたので、
私は何がいけなかったのか、理解できていない部分が何なのかに気が付くことができました。
やさしく対応していただきまして、本当にありがとうございます。

> もしもアクションリストが不要なら、ActionLists で null を返すだけでも OK。
> (実装しないからといって、NotImplementedException を投げるのは NG です)
⇒す、すごいです。oo!
 今回実現したい内容は、この方法で完璧に対応することができました。
 アクションリストを消すようなことはおそらくできないのかな?と勝手に思い込んでいたため、
 MultiLineを非表示にすることで対応しようと考えてました。
 > NotImplementedException は NG
 ⇒承知しました。


> そのデザイナ クラスを、「TextBoxを継承した数値入力専用のコントロール」の
> DesignerAttribute に割り当てていますか?
⇒ご察しの通り、割り当てを行ってませんでした。(とても恥ずかしい・・・)

 > 関連付けられたデザイナクラスを更新
 とは、ヘルプの ColorLabelActionList のように作る。と言う意味なのかと
 勝手な思い込みから属性の設定で関連付けが必要となることに気付くことができませんでした。


>>そもそも、標準のTextBoxで実装されているものを捻じ曲げるような使い方はできないものなのか、今の私には全く検討がつきません。
> できますが、System.Windows.Forms.Design.TextBoxBaseDesigner を始めとする
> 多くのデザイナは internal として設計されているため、面倒な事に、
> System.Windows.Forms.Design.ControlDesigner から実装せねばなりません。
⇒実際のサンプルコードを見て、このように実装する必要があったのかと改めて気付かされました。



その後、私が作成しているプログラムを改造して確認してみたところ、思い通りの動作となりました。(なんだかとても気持ちが良いです)

実はこの件は、昨年の11月下旬くらいから一日に数時間程度ですが、ずっと悩みながら試行錯誤を永遠に繰り返していました。
なぜ動作しないのだろう?と疑問に思いながらヘルプで調べたり、ネットで調べたりと・・・。
そもそも、どのような原理で関連付いているのかをよく理解していかないと、実際何をしなければいけないのかなど、
なかなか必要なことに気付けないことに改めて気付きました。
大変勉強になりました、本当にありがとうございました。
解決済み!

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