<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Windowsアプリケーション</title><link>http://blogs.wankuma.com/kzt/category/2078.aspx</link><description>Windowsアプリケーションに関するエントリ</description><managingEditor>kazuto</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>kazuto</dc:creator><title>[Windowsアプリケーション][VisualBasic] カスタムコントロールは難しい</title><link>http://blogs.wankuma.com/kzt/archive/2009/01/13/166268.aspx</link><pubDate>Tue, 13 Jan 2009 16:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/kzt/archive/2009/01/13/166268.aspx</guid><wfw:comment>http://blogs.wankuma.com/kzt/comments/166268.aspx</wfw:comment><comments>http://blogs.wankuma.com/kzt/archive/2009/01/13/166268.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kzt/comments/commentRss/166268.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kzt/services/trackbacks/166268.aspx</trackback:ping><description>カスタムコントロールの実装は難しい・・。&lt;br&gt;
&lt;br&gt;
今回、某掲示板の質問で「TextBoxを継承したカスタムコントロールのスマートタグにある"MultiLine"を非表示にしたい。」と言うものがあり、解いてみようと試みたが完全に行き詰まりました。&lt;br&gt;
&lt;br&gt;
まず、System.Windows.Forms.Design.ControlDesignerクラスの派生クラスを実装し、それをカスタムコントロールのDesignerAttributeに指定してみたがこれだと既存のControlDesignerを上書いてしまい継承元のControlDesignerの機能を捨てる事になってしまう。&lt;br&gt;
具体的には既存のControlDesignerの機能を使用しつつも、「既存スマートタグ内のDesignerActionListを無効、または非表示にする」事が出来ないかやってみたが、この手の情報が余りにも無さすぎです・・。&lt;br&gt;
&lt;br&gt;
とりあえずこんな感じの実装をしてみました。&lt;br&gt;
&lt;br&gt;
&lt;div style="font-family: メイリオ; font-size: 8pt; color: black; background: white; padding: 3px;"&gt;
&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System
&lt;br&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.ComponentModel
&lt;br&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.ComponentModel.Design
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; CustomTextBoxActionList
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; DesignerActionList
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; component &lt;span style="color: blue;"&gt;As&lt;/span&gt; IComponent)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.New(component)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt; GetSortedActionItems() &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.ComponentModel.Design.DesignerActionItemCollection
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; items &lt;span style="color: blue;"&gt;As&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt; DesignerActionItemCollection()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'&amp;#12392;&amp;#12426;&amp;#12354;&amp;#12360;&amp;#12378;&amp;#12504;&amp;#12483;&amp;#12480;&amp;#12540;&amp;#12450;&amp;#12452;&amp;#12486;&amp;#12512;&amp;#12398;&amp;#12415;&amp;#36861;&amp;#21152;&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; items.Add(&lt;span style="color: blue;"&gt;New&lt;/span&gt; DesignerActionHeaderItem(&lt;span style="color: #a31515;"&gt;"Sample Header"&lt;/span&gt;))
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Return&lt;/span&gt; items
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Function&lt;/span&gt;
&lt;br&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;
&lt;/div&gt;
&lt;br&gt;
このようにカスタムコントロールのスマートタグに追加するSystem.ComponentModel.Design.DesignActionListクラスの派生クラスを作り、確認用にヘッダーアイテムのみ返却。&lt;br&gt;
&lt;br&gt;
次にカスタムコントロールクラスをこんな感じで。&lt;br&gt;
&lt;br&gt;
&lt;div style="font-family: メイリオ; font-size: 8pt; color: black; background: white; padding: 3px;"&gt;
&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System
&lt;br&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.ComponentModel
&lt;br&gt;&lt;span style="color: blue;"&gt;Imports&lt;/span&gt; System.ComponentModel.Design
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt; CustomTextBox
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Inherits&lt;/span&gt; TextBox
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Private&lt;/span&gt; action &lt;span style="color: blue;"&gt;As&lt;/span&gt; DesignerActionList
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Public&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; &lt;span style="color: blue;"&gt;New&lt;/span&gt;()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.New()
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Protected&lt;/span&gt; &lt;span style="color: blue;"&gt;Overrides&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt; OnHandleCreated(&lt;span style="color: blue;"&gt;ByVal&lt;/span&gt; e &lt;span style="color: blue;"&gt;As&lt;/span&gt; System.EventArgs)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;MyBase&lt;/span&gt;.OnHandleCreated(e)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.Site &lt;span style="color: blue;"&gt;Is&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt; &lt;span style="color: blue;"&gt;Return&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; designerActionService &lt;span style="color: blue;"&gt;As&lt;/span&gt; DesignerActionService = &lt;span style="color: blue;"&gt;TryCast&lt;/span&gt;(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetService(&lt;span style="color: blue;"&gt;GetType&lt;/span&gt;(DesignerActionService)), DesignerActionService)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; designerHost &lt;span style="color: blue;"&gt;As&lt;/span&gt; IDesignerHost = &lt;span style="color: blue;"&gt;TryCast&lt;/span&gt;(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;.GetService(&lt;span style="color: blue;"&gt;GetType&lt;/span&gt;(IDesignerHost)), IDesignerHost)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; (designerActionService &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;) &lt;span style="color: blue;"&gt;AndAlso&lt;/span&gt; (designerHost &lt;span style="color: blue;"&gt;IsNot&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt;) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Dim&lt;/span&gt; lists &lt;span style="color: blue;"&gt;As&lt;/span&gt; DesignerActionListCollection = designerActionService.GetComponentActions(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;'&amp;#12371;&amp;#12371;&amp;#12364;&amp;#24494;&amp;#22937;&amp;#12539;&amp;#12539;&amp;#12539;&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;For&lt;/span&gt; &lt;span style="color: blue;"&gt;Each&lt;/span&gt; list &lt;span style="color: blue;"&gt;As&lt;/span&gt; DesignerActionList &lt;span style="color: blue;"&gt;In&lt;/span&gt; lists
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; list.GetType().Name = &lt;span style="color: #a31515;"&gt;"TextBoxActionList"&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; designerActionService.Remove(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, list)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Next&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.action &lt;span style="color: blue;"&gt;Is&lt;/span&gt; &lt;span style="color: blue;"&gt;Nothing&lt;/span&gt; &lt;span style="color: blue;"&gt;Then&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.action = &lt;span style="color: blue;"&gt;New&lt;/span&gt; CustomTextBoxActionList(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;If&lt;/span&gt; &lt;span style="color: blue;"&gt;Not&lt;/span&gt; lists.Contains(action) &lt;span style="color: blue;"&gt;Then&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; designerActionService.Add(&lt;span style="color: blue;"&gt;Me&lt;/span&gt;, &lt;span style="color: blue;"&gt;Me&lt;/span&gt;.action)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;If&lt;/span&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Sub&lt;/span&gt;
&lt;br&gt;&lt;span style="color: blue;"&gt;End&lt;/span&gt; &lt;span style="color: blue;"&gt;Class&lt;/span&gt;
&lt;/div&gt;
&lt;br&gt;
詳細としては&lt;br&gt;
&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;OnHandleCreatedメソッド内でDesignerActionServiceを取得する。&lt;/li&gt;
&lt;li&gt;取得したDesignerActionServiceのGetComponentActionsメソッドを使用して既存のスマートタグアイテムを取得する。&lt;/li&gt;
&lt;li&gt;既存のスマートタグアイテム("MultiLine")を、DesignerActionServiceのRemoveメソッドを使用して削除する。(今回名前判断をしてますが、他に判定方法が解らなかった・・)&lt;/li&gt;
&lt;li&gt;カスタムスマートタグアイテムをDesignerActionServiceのAddメソッドを使用して追加する。&lt;/li&gt;
&lt;/ol&gt;
このような実装ですが、今までカスタムスマートタグを追加するならDesignerActionServiceクラスを使用して追加すれば良いと思っていたので、削除も同様にDesignerActionServiceクラスを使用して削除すれば良いと思っていたら削除されないわけです。&lt;br&gt;
&lt;br&gt;
カスタムスマートタグアイテムはきちんと追加されるのに既存スマートタグを削除する事が出来ません！！！（キッパリ&lt;br&gt;
そもそも、ここらへんで良く使用するDesigner～ホニャララやIDesigner～ホニャララなどと言った物の分かりやすい情報が上手く見つけれない。&lt;br&gt;
&lt;br&gt;
皆さんはどのようにここらへんの勉強をされてますか？&lt;br&gt;
本当に難しいですね・・・orz&lt;br&gt;&lt;img src ="http://blogs.wankuma.com/kzt/aggbug/166268.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>