C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: TabControlでTabPageを自動生成しない方法。


(過去ログ 105 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■62516 / inTopicNo.1)  TabControlでTabPageを自動生成しない方法。
  
□投稿者/ ひらまる (5回)-(2011/10/17(Mon) 03:26:44)

分類:[VB.NET/VB2005 以降] 

お世話になっています。ひらまるです。

フォームデザイナでTabControlを継承したコントロールを設置すると、
TabPage1とTabPage2が標準で自動生成されますが、これを自動生成しない方法を探しています。

試しにコンストラクタ内で"TabPages.Clear()"を呼んでみましたが効果がありません。
おそらくコンストラクタが呼ばれた後にTabPageを自動生成するイベントか何かが呼ばれているのだと思います。
(Nameプロパティなどもコンストラクタ内で変更できないので、おそらく設置後に何かしらのイベントが呼ばれているのではと思っている)

フォームならばLoadイベントがありますが、TabControlのようなコントロールにはLoadイベントもありません。
このようなコンストラクタで変更できないプロパティの初期値を変更するにはどうしたら良いのでしょうか?
引用返信 編集キー/
■62518 / inTopicNo.2)  Re[1]: TabControlでTabPageを自動生成しない方法。
□投稿者/ NostalJ (2回)-(2011/10/17(Mon) 04:58:26)
No62516 (ひらまる さん) に返信
> お世話になっています。ひらまるです。
>
> フォームデザイナでTabControlを継承したコントロールを設置すると、
> TabPage1とTabPage2が標準で自動生成されますが、これを自動生成しない方法を探しています。
>
> 試しにコンストラクタ内で"TabPages.Clear()"を呼んでみましたが効果がありません。
> おそらくコンストラクタが呼ばれた後にTabPageを自動生成するイベントか何かが呼ばれているのだと思います。
> (Nameプロパティなどもコンストラクタ内で変更できないので、おそらく設置後に何かしらのイベントが呼ばれているのではと思っている)

イベントではないですよ。
確かに初期値にまつわるコードが吐かれるのはコンストラクタ内の InitializeComponent メソッドですが・・・
よく考えて頂ければわかるかと思いますが、コンストラクタにいくらコードを書いても、それは「配置した時の初期値」とは意味合いが異なります。
コンストラクタに書かれた値は画面デザイナから各種プロパティを変更しているのと変わりありません。
これらは、実行時 (またはデザイナが再表示される時) に実行されているだけであり、「配置の時の初期値」とはイコールではありません (配置した時はイコールかもしれませんが)。

そして配置の時の初期値は、CodeGenerator によって吐かれています。
ということでコンポーネント デザイナの方をカスタム化して、初期値を変えてやろうという発想になります。
とりあえず、System.ComponentModel.DesignerAttribute について調べてみると良いでしょう。
引用返信 編集キー/
■62527 / inTopicNo.3)  Re[2]: TabControlでTabPageを自動生成しない方法。
□投稿者/ ひらまる (6回)-(2011/10/17(Mon) 13:34:51)
No62518 (NostalJ さん) に返信
むむむむむぅ……
InitializeComponentをオーバーライドしようとしたけど、ControlクラスにInitializeComponentはない…?
DesignerAttributeは名前的にデザイン属性のクラスだから、これを継承してデフォルト値を設定するメソッドをオーバーライドして、
自作のコントロールの属性として設定する……? あとはコントロールのコンストラクタでInitializeComponentを呼ぶ…?
あれ? 結局コンストラクタで呼んでる??

引用返信 編集キー/
■62533 / inTopicNo.4)  Re[3]: TabControlでTabPageを自動生成しない方法。
□投稿者/ ひらまる (7回)-(2011/10/17(Mon) 17:17:27)
フォーム.Designer.vbの中に、Page1とPage2を生成しているコードがありますね…
このDesignerにコードを自動的に追加する設定はどのクラスのどのメソッドに……?
むぅ…せめてSystem.Windows.Forms.TabControlやSystem.ComponentModel.DesignerAttribute
の中身を見れれば理解しやすいのですが…(MSDNに書いてある定義だけじゃわかりづらい;)
参照できるってことはどっかにファイルがあるはず…ビジュアルスタジオフォルダの中か……? 見つからない…;

引用返信 編集キー/
■62540 / inTopicNo.5)  Re[4]: TabControlでTabPageを自動生成しない方法。
□投稿者/ Azulean (860回)-(2011/10/17(Mon) 22:28:51)
No62533 (ひらまる さん) に返信
> フォーム.Designer.vbの中に、Page1とPage2を生成しているコードがありますね…
> このDesignerにコードを自動的に追加する設定はどのクラスのどのメソッドに……?

DesignerAttribute で指定されているクラスで実装されています。
が、ソースコードは標準で見ることはできません。

この挙動がいやなのなら、TabControl を継承した新たなクラスを作り、そのクラスへ何もしないクラスを指定した DesignerAttribute を付与するとか。

ControlDesigner クラスあたりを読んでみるとか。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.design.controldesigner.aspx

> むぅ…せめてSystem.Windows.Forms.TabControlやSystem.ComponentModel.DesignerAttribute
> の中身を見れれば理解しやすいのですが…(MSDNに書いてある定義だけじゃわかりづらい;)
> 参照できるってことはどっかにファイルがあるはず…ビジュアルスタジオフォルダの中か……? 見つからない…;

メタデータですよね?
これは DLL に含まれているメタデータと呼ばれる、クラスやメソッド、プロパティなどの情報を元に Visual Studio が自動生成しているものであり、ソースコードではありません。
なので、コンピューター中を探してもソースコードは出てきません。

RTM バージョンや SP バージョンであれば、http://referencesource.microsoft.com/ あたりから取得できますが、ライセンスに気をつけてください。
引用返信 編集キー/
■62541 / inTopicNo.6)  Re[5]: TabControlでTabPageを自動生成しない方法。
□投稿者/ ひらまる (8回)-(2011/10/18(Tue) 00:56:25)
No62540 (Azulean さん) に返信

> DesignerAttribute で指定されているクラスで実装されています。
> が、ソースコードは標準で見ることはできません。
少しわかってきました…今回のTabControlの例だと、
おそらくTabControlクラスには、TabControlAttributeのようなクラスが属性として設定されており、
TabControlAttributeが何をしているのかは挙動から把握するしかない。ということでしょうか。

>これは DLL に含まれているメタデータと呼ばれる、クラスやメソッド、プロパティなどの情報を元に Visual Studio が自動生成しているものであり、ソースコードではありません。
なるほど。メタデータと呼ぶのですか。ライブラリとして用意されているのですね。
Javaなどでは標準クラスの中身も見れた気がするので、VBでも見れたら良いなと思っていました。
RTM・SPバージョンの情報もありがとうございます。

> この挙動がいやなのなら、TabControl を継承した新たなクラスを作り、そのクラスへ何もしないクラスを指定した DesignerAttribute を付与するとか。
属性として設定できる、何もしないクラスを作るのに四苦八苦しています。
おそらく以下のような形だと思うのですが、コメントにもあるように、なにもしないクラスで何をどうやって継承したら良いかがわかりません。
話の流れ的にSystem.Windows.Forms.Design.ControlDesignerを継承するのが正解だと思うのですが、定義されてないないと言われてしまいます。

Public Class なにもしないクラス
'Inherits System.Windows.Forms.Design.ControlDesigner
'↑定義されていませんと言われる。System.Windows.Forms.Designまでは参照できる。

'Inherits System.ComponentModel.Design.IDesigner
'↑何も継承せずにコントロールを配置したところ、
'『System.InvalidCastException型をSystem.ConponentModel.Design.IDesignerにキャストできません。』
'と言われたのでSystem.ComponentModel.Design.IDesignerを継承してみたが、
'『クラスは、他のクラスからのみ継承できます。』 と言われてしまった。
End Class

'↓デザイナー属性になにもしないクラスを設定。
<System.ComponentModel.Designer(GetType(なにもしないクラス))> _
Public Class カスタムタブコントロール
Inherits TabControl
End Class
引用返信 編集キー/
■62548 / inTopicNo.7)  Re[6]: TabControlでTabPageを自動生成しない方法。
□投稿者/ Azulean (861回)-(2011/10/18(Tue) 07:17:33)
No62541 (ひらまる さん) に返信
> 話の流れ的にSystem.Windows.Forms.Design.ControlDesignerを継承するのが正解だと思うのですが、定義されてないないと言われてしまいます。

MSDN を読まれていますか?
「アセンブリ」と書かれているところの DLL を参照していないと見つかることはありません。
引用返信 編集キー/
■62559 / inTopicNo.8)  Re[7]: TabControlでTabPageを自動生成しない方法。
□投稿者/ ひらまる (10回)-(2011/10/18(Tue) 13:37:30)
No62548 (Azulean さん) に返信
いつもありがとうございます。
おかげ様で、属性のこと、コントロールデザイナのこと、少しずつわかって参りました。

参照時、フィルターの適用先が.NET Framework 4 Client Profileになっていたので、
System.Design.dllが一覧に表示されなかったようです。
プロジェクトのプロパティ→コンパイル→コンパイラの詳細設定から、
対象のフレームワークを.NET Framework 4にしたら見つけることができました。
System.Design.dllを参照すると、System.Windows.Forms.Design.ControlDesignerを継承することができ、
以下のコードが正常に動いてカスタムタブコントロールを配置することができました。

タブの初期配置を「カスタムタブ属性クラス」で以下のように行なっているのですが、
この方法が本当に正しいのか自信がありません。

Public Class カスタムタブ属性クラス
Inherits System.Windows.Forms.Design.ControlDesigner

'属性設定されたタブコントロールのインスタンスを得る変数
Private myTabControl As TabControl

'初期化
Public Overrides Sub Initialize(ByVal component As System.ComponentModel.IComponent)
MyBase.Initialize(component)

myTabControl = CType(Me.Control, TabControl)
End Sub

'配置時のデフォルト
Public Overrides Sub OnSetComponentDefaults()
myTabControl.TabPages.Add(New TabPage("タブ1"))
myTabControl.TabPages.Add(New TabPage("タブ2"))
myTabControl.TabPages.Add(New TabPage("タブ3"))
End Sub

End Class

<System.ComponentModel.Designer(GetType(カスタムタブ属性クラス))> _
Public Class カスタムタブコントロール
Inherits TabControl
End Class

この方法だと、配置したタブコントロールのタブページをデザイナで切り替えられないなどの問題が……
…この問題はおそらく、タブページをカスタムタブコントロールとは別に生成して、カスタムタブコントロールにAddすれば解決できそうですね…
フォームのデザイナ.vbの中でそんな処理をしていた気がするので…デザイナ.vbにコードを自動追加するには…
Azuleanさんが
> このDesignerにコードを自動的に追加する設定はどのクラスのどのメソッドに……?
という質問に対して、
>DesignerAttribute で指定されているクラスで実装されています。
と回答してくださっているので、ControlDesignerクラスのメソッドの中にあるはず…
どれをオーバーライドすれば……

引用返信 編集キー/
■62572 / inTopicNo.9)  Re[8]: TabControlでTabPageを自動生成しない方法。
□投稿者/ Azulean (862回)-(2011/10/18(Tue) 22:41:43)
No62559 (ひらまる さん) に返信
> と回答してくださっているので、ControlDesignerクラスのメソッドの中にあるはず…
> どれをオーバーライドすれば……

サンプル(日本語・英語問わず)を含めて検索した結果で質問されていますか?
適当にやってたらいろいろと不具合を抱えるので、どのメソッドをどう使うべきかきちんと調べてください。
うまく見つからないのであれば、今どうやって探しているかを述べてアドバイスを求めてください。

私は、業務でこういった技を使っていないので、安全かつ確実な方法を紹介できる状態にありません。
私も試行錯誤すればたどり着けるかもしれませんが、その結果よりもきちんと学んで・調査していただいた方が確実な情報を得られると思っています。
引用返信 編集キー/
■62604 / inTopicNo.10)  Re[9]: TabControlでTabPageを自動生成しない方法。
□投稿者/ ひらまる (11回)-(2011/10/21(Fri) 00:09:22)
No62572 (Azulean さん) に返信
確かにその通りだと思います。
できるだけ自分で調べて、解決したら解決方法を書き込みたいと思います。
それでもどうしてもわからなかったら、質問させていただくこともあるかもしれませんがご容赦ください。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -