こんにちは、皆さん。今日は、C#の「フォームコントロール」の中でも、非常に重要な「タブコントロール(TabControl コントロール)」について、お話ししたいと思います。
そうですね、その他に重要なフォームコントロールとしては、「TextBox コントロール」、「RichTextBox コントロール」、「PictureBox コントロール」、「DataGridView コントロール」、
「PropertyGrid コントロール」、「MenuStrip コントロール」、「FileDialog コントロール」等があります。
全て、非常に重量級なコントロールであり、個人では殆ど作れない物なので、非常に助かります。m(_ _)m
そういう意味では、RADツールとしての「C#」の、真骨頂だと思います。
因みに、RADツールというのは、出来るだけ「プログラムコード」を書かないで、高品質なアプリケーションを、短期間で作成するというコンセプトです。
それでは、その辺りを見て行きましょう。Let’s get started !.
タブコントロールで、何が出来るのでしょうか?
タブコントロールというのは、限られた領域(画面)で「階層構造」のように、データを編集・表示ができる優れたコントロールです。
分かり易くいうと、「ノート」や「手帳」や「メモ帳」ですね。そして、各項目を選択し易いように、見出しとして「タブ(付箋のようなもの)」が、付いています。
「タブ」の下には、「各ページ」が付いていて一体化しています。これを、「タブページ(TabPage コントロール)」と言います。「タブページ」は、「Panel コントロール」と同様なので、何でも入れることが出来ます。
要するに、タブコントロール(TabControl コントロール)というのは、「システム手帳」のようなもので、中身の「リフィル」がタブページ(TabPage コントロール)という事になります。
特徴的な事としては、「タブ」の表示には、「Multiline」と「Singleline」があります。通常は「Singleline」を使いますが、「設定」等で使う場合は、「Multiline」もあります。
また、「タブ」の部分の描画を、自分で行うことが出来るようになっています。標準の描画では、満足できない場合等に使います。
「タブ」の表示位置は、「上下左右」に変更することが出来ます。Visual Studio Community の場合は、「下」に表示されることも多いですね。
一応、一般的なことは、こんな所です。
ここからは、少し「High レベル」な事になるのですが、「タブコントロール」には、「Paint イベント」がありません。ですから、基本的には、ユーザーから「タブの描画」を行うことが出来ません。
まぁ、それは「C#」としては、妥当な仕様だと思います(私なりに)。何故なら、「タブ」を描画するというのは、可なり難しいからです。
ところが、「ある事情」が発生する場合には、そうも言ってられないのです。どうしても、「タブの描画」すなわち「Paint イベント」が必要になります。
というのは、「タブコントロール」には、唯一「閉じるボタン」がありません。例えば、「ブラウザー」や「VSCode」や「IDE」でお馴染みの、「閉じるボタン」です。
「WPF」では、「XAML コードエディター」で、追加することが出来ますが、「C#」では出来ません。因みに、私自身は、「WPF」を習得していません。情報だけです(汗)。
ですから、「タブページ」を増やすことは出来ても、減らすことが出来ません(激汗)。これは、非常に困ります。これが、「ある事情」になります。
C#で「閉じるボタン」は、作れるのでしょうか?
というのが、最も心配なところだと思うのですが、結論からいうと、色々な方法があるので、安心して下さい。
とは言うものの、実は、其々に一長一短があるので、これが「正解」というのは、ありません。
ただ、やる気次第では、「ブラウザー」や「VSCode」や、「IDE」のような「閉じるボタン」も、立派に作れます。
そして、最も難しいのは、これらの「プログラムコード」を実装することではなく、「一長一短」がある方法の、どれを採用するかという決断です。
何故なら、その一長一短というのが、本当に「微妙な思案」なんです。皆さんが知っている熟語でいうと、「思案六法」というところですかね(笑)。
方法論としては、タブコントロールに、「ボタン」を追加することは出来ないので、「Paint イベント」又は、「DrawItem イベント」と、「MouseDown イベント」、「MouseMove イベント」、
「MouseUp イベント」を駆使して、恰も「ボタン」を押しているような、描画を行います。
これらは、「滅茶苦茶」難しいという分けではありませんが、ある程度難しいです。ですから、これ等の方法に関しては、「次回の記事」で詳しく説明したいと思います。
そして、もう一つ、「閉じるボタン」と同じような効果があり、「C#」的には「最もC#的」であり、「最も簡単」であり、「最も確実」であり、「最も実用的」である方法があります。
更に、今回の「閉じるボタン」の場合だけでなく、困った時に「確実に問題を解決する方法」を提供してくれる、非常に優れた方法があります(パワー)。
それは、「灯台下暗し」ではありませんが、「ContextMenuStrip コントロール」を、使うことなんです(Good)。
今回は、この「ContextMenuStrip コントロール」を使って、「閉じるボタン」を実装してみましょう。
ContextMenuStrip コントロールを、習得しましょう。
それでは、早速、「ContextMenuStrip コントロール」を、使いましょう!。と言いたい所なんですが、さて、何処に貼るのでしょうか?
Form コントロールに、「TabControl コントロール」と、「ContextMenuStrip コントロール」を、貼るだけでも良いのですが、当サイトでは、過去の記事で「基本の Form 形態」を提供しています。
ですから、それを使って、解説することになります。既に、習得している方は良いのですが、まだ習得していない方は、当サイトの「オススメ記事」を参考にして、
「基本の Form 形態」を作成してみましょう。結構、ボリュームはありますが、「未来の記事」をより深く理解するためには、是非オススメします。
具体的な作成手順は、以下の記事を参照してください。

そして、今回使用するのは、上記記事の中の三番目の「BaseTabForm」です。画像は、上記記事の中にあります(一番下の画像です)。
この形態を使って、「ContextMenuStrip コントロール」を、習得する事になります。
それでは、これから、プラモデルを組むかのように、手順を示して行きます。そして、「BaseTabForm プロジェクト」は、既に、何処かに、作成されている物とします(これが一番重要)。
「NormalTabForm プロジェクト」を作成します。
特に、名前は、何でも良いのですが、次回の記事で「CloseTabForm プロジェクト」を作成する予定なので、違いが分かるようにしています。
先ず、「Visual Studio Community」を起動して、「Windows フォーム アプリケーション (.NET Framework)」を作成します(通常)。
この時の「プロジェクト名」を、「NormalTabForm」にします。
詳しいことは、以下の記事を参照してください。

そして、「NormalTabForm プロジェクト」が起動できたら、次に、上記の記事「当サイトで扱う、基本の Form 形態について」で、既に作成済の「BaseTabForm プロジェクト」を、起動します。
これで、Visual Studio Community の「二つのプロジェクト」が、起動している状態です。この方法は、「Visual Studio の開発手法」としては、良くあることなので、この際に習得して置きましょう。
プロジェクトを、「複数」起動することは、良くあります。「コピー&ペースト」する場合とか、「比較」する場合とかです。
それでは、非常に細かい事まであるのですが、「少しずつ確実」に実装して行きましょう。エラーに関しては、余り気にする必要はありません。必ず、修正できるので。
というのは、マネージドコードなので、プログラムが暴走することはありませんし、エラーの個所は、必ず分かります。
先ず、「BaseTabForm.cs」を、コピー&ペーストします。
最初に行うことは、「BaseTabForm プロジェクト」の中にある、「BaseTabForm.cs(本体の Form)」を、「NormalTabForm プロジェクト」に「コピー」することです。
これによって、一から「基本的な Form」を作成するのではなく、簡単に、複製ができます。勿論、「基本的な Form 形態」なので、これを「NormalTabForm.cs」に変更してから、目的の実装を行います。
この流れは、一番確実な方法なんですが、多少冗長的な方法になります。しかし、初心者の方には、多分一択かも知れません(笑)。
その他のスマートな方法としては、各クラス(コントロールクラスを含めて)を、「クラスライブラリー」として作成して、参照設定するという方法もありますが、結構難しいです。
しかしこの方法の良い所は、クラスを「部品」として再利用できるので、IDEの「拡張クラス」として、扱えることです。まぁしかし、それは将来にとって置きましょう。
それでは、これから「その手順」を示しますが、急がずにゆっくりと遣りましょう。また、適度に起動「F5」して、状況を確認しましょう。
何故、「エラーになるのか?」ということが、徐々に分かって来ると思います。因みに、全てを完了しないと、必ずエラーになります(笑)。
重要なことは、「C#」というのは「マネージドコード」なので、「暴走」するということは無いので、安心して「実行(F5)」してください。
また、万が一「暴走」したとしても、「タスクマネージャー」で、確実に終了することが出来るので、安心してください。
それでは、これから、「長い旅」になるので、「コーヒーブレイク」をしてから、参りましょう。
それでは、ここからが「手順(長文)」です。
上記の説明にあるように、ここでは既に、「NormalTabForm プロジェクト(新規)」と、「BaseTabForm プロジェクト(既存)」とが、起動している状態とします。
先ず、「BaseTabForm プロジェクト」を、選択して表示します。そして、 「ソリューションエクスプローラー」の中にある、「BaseTabForm.cs」を「右クリック」します。
「コンテキストメニュー」が表示されるので、その中から「コピー(Y)」をクリックします。
実は、「BaseTabForm.cs」の中にある、「TabControl コントロール」の名前を、「SideTabControl」に変更しています(記事を、2026-03-16 に更新しています)。
ですから、確認しておいて下さい。最後に示す「ソースコード」で、使用しているので。m(_ _)m
次に、「NormalTabForm プロジェクト」を、選択して表示します。そして、「ソリューションエクスプローラー」の上の方にある太字の、「C# NormalTabForm」を「右クリック」します。
「コンテキストメニュー」が表示されるので、その中から「貼り付け(P)」をクリックします。これで、「BaseTabForm.cs」がペーストされました。
「NormalTabForm プロジェクト」に、「BaseTabForm.cs」が追加されたので、元々ある「Form1.cs」は不要なので、削除します。
方法は、「Form1.cs」を右クリックして、「コンテキストメニュー」の中から、「削除(D)」をクリックします。
「‘Form1.cs’ は完全に削除されます。」というメッセージが表示されるので、「 OK 」をクリックします。
次に、追加された「BaseTabForm.cs」の名前を、「NormalTabForm.cs」に変更します。
変更の詳しい方法は、過去の「オススメ記事」の中にあるので、分からない場合は参照してください。
「名前の変更」というキーワードで、当サイトのトップページの、「調べる」ー「検索」から検索できます。
ここでは、「BaseTabForm.cs」を「右クリック」して、「コンテキストメニュー」の中の「名前の変更(M)」をクリックします。
そうすると、名前が変更できるようになるので、「NormalTabForm.cs」に変更して、「Enter キー」を押下します。
「ファイルの名前を…..、名前を変更しますか?」というメッセージが出るので、「 はい(Y) 」をクリックします。
これで、「BaseTabForm.cs」の複製が、クリック操作だけで「簡単」に出来ました。
ただし、この状態では、まだ「名前空間(namespace)」が異なっているので、使い易いように変更します。
先ず、名前を変更した「NormalTabForm.cs」を、「ダブルクリック」します。
通常は、デザイナー画面が表示されるのですが、タイミングによっては、ソースコードが表示される場合があるので、その時は、もう一度「ダブルクリック」をします。
この場合は、「デザイナー画面」と「ソースコード」の、両方が表示されています。
逆に、もし「デザイナー画面」だけの場合は、「ソリューションエクスプローラー」の上段にある「<>(コードの表示)」をクリックして、「ソースコード」を表示して、選択してください。
そして、以下の「操作(変更)」を行います。ここは重要なので、焦らずにゆっくりと行いましょう。
- 「ソースコード」の一番上の方にある、「namespace BaseTabForm」を、「namespace NormalTabForm」に変更します。
- そうすると、色んな所に、「赤い波線の下線」が表示されるので、次にこれを修正します。これは、「InitializeComponent();」が「名前空間」に無いので、エラーになります。
- そこで、「NormalTabForm.cs」の直ぐ下にある、「NormalTabForm.Designer.cs」を「ダブルクリック」して、「ソースコード」を表示します。
- そして、一番上にある、「namespace BaseTabForm」を、「namespace NormalTabForm」に変更します。
- これで、エラーは消えるので、「NormalTabForm.cs」のソースコードを、見てみましょう。先程の「赤い波線の下線」は、消えている筈です(少し時間が掛かるかも知れません)。
この時に、「NormaTabForm」になっている場合があるので、「NormalTabForm」になっているか、しっかりと確認しましょう。
- これで、エラーが無くなったので、動く筈なんですが、最後に「Program.cs」の修正が必要になります。それを、次に変更します。
それでは、「Program.cs」を「ダブルクリック」して下さい。ソースコードが表示されます。
その中に、「Application.Run(new Form1());」があり、「赤い波線の下線」が付いています。これを、「Application.Run(new NormalTabForm());」に変更します。
実は、この「Program.cs」は、アプリケーションの「エントリーポイント」なので、結構重要なんですが、今は余り気にする必要はありません。
これで、動く筈なので、「▲ 開始」をクリックしましょう。または、「F5」を押下しましょう。上手く動けば、成功です(パワー)。
上手く動かない場合は、もう一度、一からやり直しましょう。難しいフェーズではないので、頑張りましょう。それは、必ず、財産になります。
これから必要なのは、「NormalTabFor.cs [デザイン]」と、「NormalTabForm.cs」だけなので、それ以外は、「閉じるボタン ×」をクリックして、閉じて置きましょう(爆笑)。
これで一応、一段落です。この手順は、アプリケーション開発においては、比較的「原始的な方法」ではありますが、「最も安全」で、「最も簡単」で、「最も早い」方法です(笑)。
この際に、是非、マスターして置きましょう。
しかし、まだまだ、先は長いです(汗)。一旦、「コーヒーブレイク」を取りましょう。
さぁ、長い冬も、そろそろ終わりですね。後、半月もすれば「桜」の季節です。
私の近所でも、「良い桜の木」が、結構何本も咲くので、良い感じですよ。まぁ、写真に撮って「アイキャッチ画像」に使おうかな?、とも考えているのですが・・・(笑)。
しかし、「桜の色」というのは、何であんなに「心に響く」のでしょうか?。特に「ソメイヨシノ」は、別格ですね。
年に一度、しかも「ほんの一瞬」の期間ですが、心が洗われます。
それでは、NormalTabForm.cs を作成して行きましょう。
それでは、基本的な準備が整ったので、「NormalTabForm.cs」を完成させましょう。
難しいことは、何もありませんが、少々細かい手順もあるので、焦らずにゆっくりと遣りましょう。
今回使用するのは、Form が余り大きいと「テスト」が冗長になるので、コンパクトにしましょう。先ず、「NormalTabForm.cs」のデザインタブを表示します。
右側のプロパティグリッドから、以下の変更を行います。
- Form コントロールを、「Size: 800, 600」にします。そして、「Text: NormalTabForm」にします。
- SplitContainer コントロールを、「SplitterDistance: 445」にします。
この値は、後で、コードでも設定してください。何故か、ズレて来るので(笑)。
(このズレは、拡大/縮小の時にも起こるのですが、今は気にしないで置きましょう。対処方法はあるので、別の機械に説明します。)
これで、コンパクトになりました。
これを最初に行うのは、「TabControl コントロール」や「ContextMenuStrip コントロール」で、イメージを扱う場合があるからです。
そして、これは結構、細かい作業になります。
それでは、左側にある「ツールボックス」から「ImageList」をクリックして、ドラッグ&ドロップで Form の上に貼ります(場所は、どこでも構いません)。
そして、右側のプロパティグリッドで、「(Name)」を「imageList1」から「ImageList」に変更します。
次に、一番下にある「Images: (コレクション) …」の、三点リーダーをクリックします。「イメージコレクションエディター」が起動するので、アイコンを追加して行きます。
「追加(A)」をクリックすると、「エクスプローラー」が起動するので、「アイコンのある場所」を指定しましょう。
アイコンが何処に有るのかというと、「当サイトで扱う、「基本の Form 形態」について。」の記事の中で、説明しているので参照してください。
今回扱うのは、「Visual Studio 2022 Image Library.zip」を、解凍したものです。
アイコンのある場所を指定すれば、自動的に、アイコンの画像が表示されます。どんなアイコンが必要なのかは、人其々なので、自由に行ってください。
今回は、テスト用として、三個だけ追加します。ファイル名は、「TextFile.png」、「Image.png」、「Document.png」です。非常に細かい作業になります(笑)。
これで、何時でも、アイコンが使えるようになりました。
余談ですが、ここで、「ToolTip コントロール」を、追加して置きましょう。(実は、「コピー元の BaseTabForm.cs」 に入れて置くのが、一番良いですね。)
このコントロールは、アプリケーションとは直接関係ないのですが、色んな各コントロールに、「説明」を入れることが出来ます。
適選に、「操作方法」とかを丁寧に入れて置くと、後々、助かることがあります(笑)。
方法は、簡単で、「ツールボックス」から「ToolTip」をクリックして、ドラッグ&ドロップで Form の上に貼り付けるだけです。後は、何もする必要はありません。
各コントロールの上(又は何処か)に、「ToolTip の ToolTip」という「項目」が増えます。
次に、最も重要な「TabControl コントロール」を貼りましょう。
左側にある「ツールボックス」から「TabControl」をクリックして、ドラッグ&ドロップで SplitContainer の Panel1(左側)の上に貼ります(場所は、どこでも構いません)。
そのまま、以下のプロパティを設定します。
| (Name) | NormalTabControl | 名前 |
|---|---|---|
| Multiline | True | 複数行のタブ |
| Dock | Fill | 境界線の定義 |
| ImageList | ImageList | イメージリスト |
通常は、「Multiline: False」にするのですが、今回はテスト用なので、より複雑にした方が色々と発見できるので、そうしています。
テスト用として、「TabPage コントロール」を「7ページ」作ります。そして、最初の3ページに「イメージ(xxxxx.png)」を設定しましょう。
全てのページに、イメージを設定しても良いのですが、今回は「動作」や「違い」の検証なので、色々と自由に設定してみましょう。
それでは、「TabControl コントロール」のプロパティグリッドから、「TabPages: (コレクション) …」を選択して、三点リーダーをクリックします。
「TabPage コレクションエディター」が起動します。この状態では、「tabPage4」「tabPage5」の、二つの項目が表示されている筈です。
一応、「追加(A)」を五回押して、「tabPage4」~「tabPage10」まで作ります。特に数は、制限していないので、ご自由にどうぞ。
次に、イメージを設定したいので、「tabPage4」をクリックします。そして、「右側のプロパティグリッド」の、一番上の方にある「ImageKey」をクリックして、好みのイメージを選択します。
この操作を、「tabPage4」~「tabPage6」まで行います。他にも設定したい項目があれば、ご自由にどうぞ!。そして出来たら、下にある「 OK 」をクリックします。
次は、いよいよ、今回の主役の「ContextMenuStrip コントロール」を、作って行きます。難しいことは、何もありません。
当サイトの「オススメ記事」を、何回も練習していれば、簡単に作れます。
「ツールボックス」から「ContextMenuStrip」をクリックして、ドラッグ&ドロップで Form の上に貼ります(場所は、どこでも構いません)。
そして、プロパティグリッドで、「(Name)」を「contextMenuStrip1」から「ContextMenuStrip」に変更します。
それでは、右側のプロパティグリッドから、「Items: (コレクション) …」を選択して、三点リーダーをクリックします。
「項目コレクションエディター」が起動するので、アイテムを「 追加(A) 」して行きます。
追加する項目は、順番に「MenuItem 4個」、「Separator 1個」、「MenuItem 1個」の計6個を追加します。
種類は、コンボボックスの中から選択して、「 追加(A) 」をクリックして行きます。
ここが、最も重要で、最も複雑なところです(笑)。
セパレーターを除く、5個並んだ各アイテム「toolStripMenuItem1 ~ toolStripMenuItem5」を、上から順番に、以下のように変更します。
| (Name) | Text | Image | SKeys |
|---|---|---|---|
| FirstTabMenuItem | 先頭に移動(&F) | ||
| LeftTabMenuItem | 左に移動(&L) | ||
| RightTabMenuItem | 右に移動(&R) | ||
| LastTabMenuItem | 末尾に移動(&A) | ||
| CloseTabMenuItem | タブを閉じる | Close.png | Ctrl+C |
最後の「SKeys」は、「ShortcutKeys」を略したものです。というのは、見栄えを良くする為の工夫です(笑)。
「(Name)」は、「接頭辞」に、簡潔で意味のある単語を使用します。「XxxxxMenuItem」は、基本的に固定です。というのは、見ただけで、コントロールの種類が分かるので。
「Text」にある最後の「・・・(&X)」というのは、キーボードからの文字「X」を、受け付ける場合に記述します。基本的には、「頭文字」を使用します。
しかし、頭文字が重なった場合は、「2番目以降の文字」を使用します。
「Image」は、「ImageList」が使えないので、直に設定します。三点リーダーをクリックして、「ローカルリソース(L):」-「インポート(M)…」をクリックします。
「エクスプローラー」が起動するので、「アイコンのある場所」を指定しましょう。今回は、「Close.png」を使います。
「ShortcutKeys」は、それ自体が「キーボード」からの、一発ショットの「コマンド」になります。
これらの違いを、後で、体験してみましょう。どういう時に、使い分けるのかは、私にも分かりません(笑)。まぁ、ディファクトスタンダードという事で、良いと思います。m(_ _)m
全ての設定が出来たら、「 OK 」をクリックしましょう。
これで、基本的な作業は、全て終了です。後は、これ等を使えるようにしましょう。そして、各項目に、「クリックイベント」を設定しましょう。
さぁ、デザインは、あと少しです。頑張りましょう。
Form 上の「NormalTabControl」を、クリックして選択・表示します。「xxxxxTabPage」以外の部分を、クリックすると選択出来ます。
これは、結構難しいです(笑)。何処か、余白の部分をクリックすると、上手く行きます。
或いは、確実に選択する場合は、プロパティグリッドの上の「コンボボックス」から、選択出来ます。
次に、「プロパティグリッド」の「ContextMenuStrip」の項目をクリックして、「ContextMenuStrip」を選択します。
これで、「NormalTabControl」で「ContextMenuStrip」が、使えるように成りました。
それでは、「▲ 開始」をクリックしましょう。または、「F5」を押下しましょう。そして起動できたら、「TabControl コントロール」上で、「右クリック」をしてみましょう。
「コンテキストメニュー」が、表示されます(感動)。
後は、各項目に「イベント」を追加して、プログラムを実装すれば、完成です。
ここでは、色んな方法があるのですが、一番確実な方法を示します。
- デザイナー画面の下の欄にある、「ContextMenuStrip」をクリックします。
- 画面左上部に、その内容が表示されるので、一番上の項目を、クリックします。
- 右側の「プロパティグリッド」に、プロパティが表示されるので、そのまま、一番上にある「§雷のアイコン(イベント)」をクリックします。
- 「イベント」が表示されたら、一番上の「Click 」を「ダブルクリック」します。そうすると、「ソースコード画面」に「Click イベント」が設定されて、エントリーが表示されます。
- この「1」~「4」の流れが、デザイナーによる、一連の「イベントの設定方法」です。他にも方法はありますが、先ずは、この方法を習得しましょう。
- 次に、デザイナー画面に戻って、「2」~「4」の方法を、セパレーターを除いて、「タブを閉じる Ctrl+C」まで行います。
- これで、「ソースコード画面」に、五つのイベントが設定出来ました。
以上で、デザイナーでの作業は、全て終了しました。ご苦労様でした。m(_ _)m
最後に、「イベント」に、ソースコードを実装しましょう。
さぁ、漸くここまで来ましたね。実は、ここまでが、一番大変な作業であり、一番楽しい作業なんです。
何故なら、これまでの一連の作業は、「設計」なんです。そして、ソースコードを実装するというのが、実は「施工」なんです。よく言われるのが、「設計七年、施工三年」なんですね(爆笑)。
どこまで、「ユーザーフレンドリー」にするのかは、「設計」に掛かっています(パワー)。
それでは、最後に、全ての「ソースコード」を書いて置きます。しかしこれは、自分で全てを実装(ソースコードを作成)してから、見てください。急ぐ場合を除いて(笑)。
難しいことは何もありませんが、初心者の方が、マニュアルを頼りに実装するのは、「天文学的」に難しいと思います。しかしそれは、色んな事を参照する「機会」になります。
NormalTabForm のソースコードです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NormalTabForm
{
/// <summary>
/// NormalTabForm を提供します。
/// </summary>
public partial class NormalTabForm : Form
{
/// <summary>
/// 新しいインスタンスを作成します。
/// </summary>
public NormalTabForm()
{
// デザイナーが行う初期設定です。
InitializeComponent();
// 個人的な初期設定を行います。
InitializeMyMember();
// 特定のコントロールを、アクティブにしないようにします。
// 通常は、特に必要ありません。
this.Select();
}
#region ● 初期設定
/// <summary>
/// 初期設定を行います。
/// </summary>
private void InitializeMyMember()
{
// プロパティ等を確実に設定したい場合は、コードで設定します。
// (また、動的な状態で設定したい場合は、起動時イベントを使います。)
SplitContainer.SplitterDistance = 445;
// TabPage の背景色を、Control にします。
// まとめて設定したい場合も、コードで設定します。
foreach (TabPage tp in SideTabControl.TabPages)
{
tp.BackColor = SystemColors.Control;
}
// 最初のご挨拶。特に必要ありません。
MessageStatusLabel.Text = "NormalTabForm を提供します。";
}
#endregion
#region ● イベント
/// <summary>
/// 右ペインを閉じたり開いたりします。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <remarks>ステータスラベルは、色々と活用出来ます。</remarks>
private void PaneStatusLabel_Click(object sender, EventArgs e)
{
if (SplitContainer.Panel2Collapsed == false)
{
SplitContainer.Panel2Collapsed = true;
PaneStatusLabel.Text = "ペインを開く";
}
else
{
SplitContainer.Panel2Collapsed = false;
PaneStatusLabel.Text = "ペインを閉じる";
}
}
/// <summary>
/// タブページを先頭に移動します。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FirstTabMenuItem_Click(object sender, EventArgs e)
{
if (NormalTabControl.SelectedIndex == 0) return;
// タブページを先頭に移動します。
TabPage tabPg = NormalTabControl.SelectedTab;
NormalTabControl.TabPages.Remove(tabPg);
NormalTabControl.TabPages.Insert(0, tabPg);
NormalTabControl.SelectedTab = tabPg;
}
/// <summary>
/// タブページを左に移動します。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LeftTabMenuItem_Click(object sender, EventArgs e)
{
if (NormalTabControl.SelectedIndex == 0) return;
// タブページを左に移動します。
int tabInd = NormalTabControl.SelectedIndex;
TabPage tabPg = NormalTabControl.SelectedTab;
NormalTabControl.TabPages.Remove(tabPg);
NormalTabControl.TabPages.Insert(tabInd - 1, tabPg);
NormalTabControl.SelectedTab = tabPg;
}
/// <summary>
/// タブページを右に移動します。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RightTabMenuItem_Click(object sender, EventArgs e)
{
if (NormalTabControl.SelectedIndex ==
NormalTabControl.TabCount - 1) return;
// タブページを右に移動します。
int tabInd = NormalTabControl.SelectedIndex;
TabPage tabPg = NormalTabControl.SelectedTab;
NormalTabControl.TabPages.Remove(tabPg);
NormalTabControl.TabPages.Insert(tabInd + 1, tabPg);
NormalTabControl.SelectedTab = tabPg;
}
/// <summary>
/// タブページを末尾に移動します。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LastTabMenuItem_Click(object sender, EventArgs e)
{
if (NormalTabControl.SelectedIndex ==
NormalTabControl.TabCount - 1) return;
// タブページを末尾に移動します。
TabPage tabPg = NormalTabControl.SelectedTab;
NormalTabControl.TabPages.Remove(tabPg);
NormalTabControl.TabPages.Insert(
NormalTabControl.TabCount, tabPg);
NormalTabControl.SelectedTab = tabPg;
}
/// <summary>
/// タブページを閉じます。
/// </summary>
/// <remarks>
/// 通常、ドキュメント等を閉じる場合は、保存処理等が
/// 必要なのですが、ここでは省略します。
/// </remarks>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CloseTabMenuItem_Click(object sender, EventArgs e)
{
DialogResult ret = MessageBox.Show(
"\"" + NormalTabControl.SelectedTab.Text + "\"" +
" のタブページを閉じますか?", this.Text,
MessageBoxButtons.OKCancel);
// タブページを閉じます。
if (ret == DialogResult.OK)
{
NormalTabControl.TabPages.Remove(
NormalTabControl.SelectedTab);
}
}
#endregion
}
}
重要なのは、「結果」ではありません。何かに挑戦するという「ファイト」です。頑張りましょう。「千里の道も一歩から」ですよ(笑)。
さぁ、最後に、サプライズ(Suprise)です。
ここ迄の結果を、表示して置きます。以下のような「画面」が起動できたら、成功です。

右側にある「プロパティグリッド」は、デザイナーの左側にあるツールボックスから、「PropertyGrid コントロール」を、「SideTabControl の TabPage1」に貼り付けたものです。
そして、プロパティの画面から、「Dock: Fill」、「SelectedObject: NormalTabControl」にしたものです。非常に簡単ですね(笑)。
しかし、この簡単なことを追加するだけで、「無限大」に可能性が広がります(ナイス)。
後は、「TabControl コントロール」上で、「右クリック」すると、「コンテキストメニュー」が表示されます。色々と遊んでみましょう(笑)。
また、プロパティグリッドでも、色々と変更ができるので、遊んでみましょう(笑)。
更に、この「NormalTabForm プロジェクト」を基本として、アプリケーションを発展することも出来ます。当サイトによる制限は無いので、自由に使用してください。
まとめ。
さぁ、如何でしたでしょうか?。簡単だったでしょうか?、それとも、難しかったでしょうか?
何方にしても、重要なのは、見ているだけではなく、実際に試して見ることです。自分の目で見て、自分の体で感じて、一歩ずつ前に進みましょう。
他人の評価も重要ですが、自分の「大志」は更に重要です。失敗したことは、何時か、何かの役に立つ時も来るでしょう。その日まで、頑張りましょう(待てば海路の日和あり)。
まだまだ、「天文学的」に難しいことは、星の数ほどあります。しかしそれ等は、この基本的なことの「積み重ね」だと思います。
それでは、この辺でごきげんよう。(^_^)/


コメント