「TabControl コントロール」の使い方について。

当ページのリンクには広告が含まれています。

 こんにちは、皆さん。今日は、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 プロジェクト(既存)」とが、起動している状態とします。

STEP
「BaseTabForm.cs」を、コピーします。

 先ず、「BaseTabForm プロジェクト」を、選択して表示します。そして、 「ソリューションエクスプローラー」の中にある、「BaseTabForm.cs」を「右クリック」します。

 「コンテキストメニュー」が表示されるので、その中から「コピー(Y)」をクリックします。

 実は、「BaseTabForm.cs」の中にある、「TabControl コントロール」の名前を、「SideTabControl」に変更しています(記事を、2026-03-16 に更新しています)。

 ですから、確認しておいて下さい。最後に示す「ソースコード」で、使用しているので。m(_ _)m

STEP
「BaseTabForm.cs」を、ペーストします。

 次に、「NormalTabForm プロジェクト」を、選択して表示します。そして、「ソリューションエクスプローラー」の上の方にある太字の、「C# NormalTabForm」を「右クリック」します。

 「コンテキストメニュー」が表示されるので、その中から「貼り付け(P)」をクリックします。これで、「BaseTabForm.cs」がペーストされました。

STEP
「Form1.cs」を削除します。

 「NormalTabForm プロジェクト」に、「BaseTabForm.cs」が追加されたので、元々ある「Form1.cs」は不要なので、削除します。

 方法は、「Form1.cs」を右クリックして、「コンテキストメニュー」の中から、「削除(D)」をクリックします。

 「‘Form1.cs’ は完全に削除されます。」というメッセージが表示されるので、「 OK 」をクリックします。

STEP
「BaseTabForm.cs」を、「NormalTabForm.cs」に変更します。

 次に、追加された「BaseTabForm.cs」の名前を、「NormalTabForm.cs」に変更します。

 変更の詳しい方法は、過去の「オススメ記事」の中にあるので、分からない場合は参照してください。

 「名前の変更」というキーワードで、当サイトのトップページの、「調べる」ー「検索」から検索できます。

 
 ここでは、「BaseTabForm.cs」を「右クリック」して、「コンテキストメニュー」の中の「名前の変更(M)」をクリックします。

 そうすると、名前が変更できるようになるので、「NormalTabForm.cs」に変更して、「Enter キー」を押下します。

 「ファイルの名前を…..、名前を変更しますか?」というメッセージが出るので、「 はい(Y) 」をクリックします。

 これで、「BaseTabForm.cs」の複製が、クリック操作だけで「簡単」に出来ました。

 ただし、この状態では、まだ「名前空間(namespace)」が異なっているので、使い易いように変更します。

STEP
名前空間(namespace)を、変更します。

 先ず、名前を変更した「NormalTabForm.cs」を、「ダブルクリック」します。

 通常は、デザイナー画面が表示されるのですが、タイミングによっては、ソースコードが表示される場合があるので、その時は、もう一度「ダブルクリック」をします。

 この場合は、「デザイナー画面」と「ソースコード」の、両方が表示されています。

 逆に、もし「デザイナー画面」だけの場合は、「ソリューションエクスプローラー」の上段にある「<>(コードの表示)」をクリックして、「ソースコード」を表示して、選択してください。

 そして、以下の「操作(変更)」を行います。ここは重要なので、焦らずにゆっくりと行いましょう。

  1. 「ソースコード」の一番上の方にある、「namespace BaseTabForm」を、「namespace NormalTabForm」に変更します。
     
  2. そうすると、色んな所に、「赤い波線の下線」が表示されるので、次にこれを修正します。これは、「InitializeComponent();」が「名前空間」に無いので、エラーになります。
     
  3. そこで、「NormalTabForm.cs」の直ぐ下にある、「NormalTabForm.Designer.cs」を「ダブルクリック」して、「ソースコード」を表示します。
     
  4. そして、一番上にある、「namespace BaseTabForm」を、「namespace NormalTabForm」に変更します。
     
  5. これで、エラーは消えるので、「NormalTabForm.cs」のソースコードを、見てみましょう。先程の「赤い波線の下線」は、消えている筈です(少し時間が掛かるかも知れません)。

    この時に、「NormaTabForm」になっている場合があるので、「NormalTabForm」になっているか、しっかりと確認しましょう。
     
  6. これで、エラーが無くなったので、動く筈なんですが、最後に「Program.cs」の修正が必要になります。それを、次に変更します。
STEP
「Program.cs」を変更します。

 それでは、「Program.cs」を「ダブルクリック」して下さい。ソースコードが表示されます。

 その中に、「Application.Run(new Form1());」があり、「赤い波線の下線」が付いています。これを、「Application.Run(new NormalTabForm());」に変更します。

 実は、この「Program.cs」は、アプリケーションの「エントリーポイント」なので、結構重要なんですが、今は余り気にする必要はありません。

STEP
さぁ、起動してみましょう。

 これで、動く筈なので、「 開始」をクリックしましょう。または、「F5」を押下しましょう。上手く動けば、成功です(パワー)。

 上手く動かない場合は、もう一度、一からやり直しましょう。難しいフェーズではないので、頑張りましょう。それは、必ず、財産になります。

STEP
それでは、不要なタブを削除して置きましょう。

 これから必要なのは、「NormalTabFor.cs [デザイン]」と、「NormalTabForm.cs」だけなので、それ以外は、「閉じるボタン ×」をクリックして、閉じて置きましょう(爆笑)。

 
 これで一応、一段落です。この手順は、アプリケーション開発においては、比較的「原始的な方法」ではありますが、「最も安全」で、「最も簡単」で、「最も早い」方法です(笑)。

 この際に、是非、マスターして置きましょう。

 しかし、まだまだ、先は長いです(汗)。一旦、「コーヒーブレイク」を取りましょう。

 さぁ、長い冬も、そろそろ終わりですね。後、半月もすれば「桜」の季節です。

  私の近所でも、「良い桜の木」が、結構何本も咲くので、良い感じですよ。まぁ、写真に撮って「アイキャッチ画像」に使おうかな?、とも考えているのですが・・・(笑)。

 しかし、「桜の色」というのは、何であんなに「心に響く」のでしょうか?。特に「ソメイヨシノ」は、別格ですね。

 年に一度、しかも「ほんの一瞬」の期間ですが、心が洗われます。

それでは、NormalTabForm.cs を作成して行きましょう。

 それでは、基本的な準備が整ったので、「NormalTabForm.cs」を完成させましょう。

 難しいことは、何もありませんが、少々細かい手順もあるので、焦らずにゆっくりと遣りましょう。

STEP
Form の大きさを整えましょう。

 今回使用するのは、Form が余り大きいと「テスト」が冗長になるので、コンパクトにしましょう。先ず、「NormalTabForm.cs」のデザインタブを表示します。

 右側のプロパティグリッドから、以下の変更を行います。

  1.  Form コントロールを、「Size: 800, 600」にします。そして、「Text: NormalTabForm」にします。
     
  2.  SplitContainer コントロールを、「SplitterDistance: 445」にします。
    この値は、後で、コードでも設定してください。何故か、ズレて来るので(笑)。

     (このズレは、拡大/縮小の時にも起こるのですが、今は気にしないで置きましょう。対処方法はあるので、別の機械に説明します。)

 これで、コンパクトになりました。

STEP
先ず、「ImageList コントロール」を、Form に落とします。

 これを最初に行うのは、「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」という「項目」が増えます。

STEP
「TabControl コントロール」を、「Panel1」 に貼ります。

 次に、最も重要な「TabControl コントロール」を貼りましょう。

 左側にある「ツールボックス」から「TabControl」をクリックして、ドラッグ&ドロップで SplitContainer の Panel1(左側)の上に貼ります(場所は、どこでも構いません)。

 そのまま、以下のプロパティを設定します。

(Name)NormalTabControl名前
MultilineTrue複数行のタブ
DockFill境界線の定義
ImageListImageListイメージリスト

 通常は、「Multiline: False」にするのですが、今回はテスト用なので、より複雑にした方が色々と発見できるので、そうしています。

STEP
「TabPage コントロール」を増やします。

 テスト用として、「TabPage コントロール」を「7ページ」作ります。そして、最初の3ページに「イメージ(xxxxx.png)」を設定しましょう。

 全てのページに、イメージを設定しても良いのですが、今回は「動作」や「違い」の検証なので、色々と自由に設定してみましょう。

 それでは、「TabControl コントロール」のプロパティグリッドから、「TabPages: (コレクション) …」を選択して、三点リーダーをクリックします。

 「TabPage コレクションエディター」が起動します。この状態では、「tabPage4」「tabPage5」の、二つの項目が表示されている筈です。

 一応、「追加(A)」を五回押して、「tabPage4」~「tabPage10」まで作ります。特に数は、制限していないので、ご自由にどうぞ。
 

 次に、イメージを設定したいので、「tabPage4」をクリックします。そして、「右側のプロパティグリッド」の、一番上の方にある「ImageKey」をクリックして、好みのイメージを選択します。

 この操作を、「tabPage4」~「tabPage6」まで行います。他にも設定したい項目があれば、ご自由にどうぞ!。そして出来たら、下にある「 OK 」をクリックします。

 次は、いよいよ、今回の主役の「ContextMenuStrip コントロール」を、作って行きます。難しいことは、何もありません。

 当サイトの「オススメ記事」を、何回も練習していれば、簡単に作れます。

STEP
「ContextMenuStrip コントロール」を、Form に落とします。

 「ツールボックス」から「ContextMenuStrip」をクリックして、ドラッグ&ドロップで Form の上に貼ります(場所は、どこでも構いません)。

 そして、プロパティグリッドで、「(Name)」を「contextMenuStrip1」から「ContextMenuStrip」に変更します。

STEP
次に、各アイテムを追加して行きます。

 それでは、右側のプロパティグリッドから、「Items: (コレクション) …」を選択して、三点リーダーをクリックします。

 「項目コレクションエディター」が起動するので、アイテムを「 追加(A) 」して行きます。

 追加する項目は、順番に「MenuItem 4個」、「Separator 1個」、「MenuItem 1個」の計6個を追加します。

 種類は、コンボボックスの中から選択して、「 追加(A) 」をクリックして行きます。

STEP
各アイテムに、名前を付けて行きます。

 ここが、最も重要で、最も複雑なところです(笑)。

 セパレーターを除く、5個並んだ各アイテム「toolStripMenuItem1 ~ toolStripMenuItem5」を、上から順番に、以下のように変更します。
 

(Name)TextImageSKeys
FirstTabMenuItem先頭に移動(&F)
LeftTabMenuItem左に移動(&L)
RightTabMenuItem右に移動(&R)
LastTabMenuItem末尾に移動(&A)
CloseTabMenuItemタブを閉じるClose.pngCtrl+C

 
 最後の「SKeys」は、「ShortcutKeys」を略したものです。というのは、見栄えを良くする為の工夫です(笑)。

 「(Name)」は、「接頭辞」に、簡潔で意味のある単語を使用します。「XxxxxMenuItem」は、基本的に固定です。というのは、見ただけで、コントロールの種類が分かるので。 

 「Text」にある最後の「・・・(&X)」というのは、キーボードからの文字「X」を、受け付ける場合に記述します。基本的には、「頭文字」を使用します。

 しかし、頭文字が重なった場合は、「2番目以降の文字」を使用します。

 「Image」は、「ImageList」が使えないので、直に設定します。三点リーダーをクリックして、「ローカルリソース(L):」-「インポート(M)…」をクリックします。

 「エクスプローラー」が起動するので、「アイコンのある場所」を指定しましょう。今回は、「Close.png」を使います。

 「ShortcutKeys」は、それ自体が「キーボード」からの、一発ショットの「コマンド」になります。

 これらの違いを、後で、体験してみましょう。どういう時に、使い分けるのかは、私にも分かりません(笑)。まぁ、ディファクトスタンダードという事で、良いと思います。m(_ _)m

 全ての設定が出来たら、「 OK 」をクリックしましょう。

 これで、基本的な作業は、全て終了です。後は、これ等を使えるようにしましょう。そして、各項目に、「クリックイベント」を設定しましょう。

STEP
「NormalTabControl コントロール」に、設定しましょう。

 さぁ、デザインは、あと少しです。頑張りましょう。

 Form 上の「NormalTabControl」を、クリックして選択・表示します。「xxxxxTabPage」以外の部分を、クリックすると選択出来ます。

 これは、結構難しいです(笑)。何処か、余白の部分をクリックすると、上手く行きます。

 或いは、確実に選択する場合は、プロパティグリッドの上の「コンボボックス」から、選択出来ます。
 

 次に、「プロパティグリッド」の「ContextMenuStrip」の項目をクリックして、「ContextMenuStrip」を選択します。

 これで、「NormalTabControl」で「ContextMenuStrip」が、使えるように成りました。

 それでは、「 開始」をクリックしましょう。または、「F5」を押下しましょう。そして起動できたら、「TabControl コントロール」上で、「右クリック」をしてみましょう。

 「コンテキストメニュー」が、表示されます(感動)。

 後は、各項目に「イベント」を追加して、プログラムを実装すれば、完成です。

STEP
コンテキストメニューの項目に、イベントを追加して行きます。

 ここでは、色んな方法があるのですが、一番確実な方法を示します。

  1.  デザイナー画面の下の欄にある、「ContextMenuStrip」をクリックします。
     
  2.  画面左上部に、その内容が表示されるので、一番上の項目を、クリックします。
     
  3.  右側の「プロパティグリッド」に、プロパティが表示されるので、そのまま、一番上にある「§雷のアイコン(イベント)」をクリックします。
     
  4.  「イベント」が表示されたら、一番上の「Click 」を「ダブルクリック」します。そうすると、「ソースコード画面」に「Click イベント」が設定されて、エントリーが表示されます。
     
  5.  この「1」~「4」の流れが、デザイナーによる、一連の「イベントの設定方法」です。他にも方法はありますが、先ずは、この方法を習得しましょう。
     
  6.  次に、デザイナー画面に戻って、「2」~「4」の方法を、セパレーターを除いて、「タブを閉じる Ctrl+C」まで行います。
     
  7.  これで、「ソースコード画面」に、五つのイベントが設定出来ました。
     

 以上で、デザイナーでの作業は、全て終了しました。ご苦労様でした。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 コントロール」を、「SideTabControlTabPage1」に貼り付けたものです。

 そして、プロパティの画面から、「Dock: Fill」、「SelectedObject: NormalTabControl」にしたものです。非常に簡単ですね(笑)。

 しかし、この簡単なことを追加するだけで、「無限大」に可能性が広がります(ナイス)。

 後は、「TabControl コントロール」上で、「右クリック」すると、「コンテキストメニュー」が表示されます。色々と遊んでみましょう(笑)。

 また、プロパティグリッドでも、色々と変更ができるので、遊んでみましょう(笑)。

 更に、この「NormalTabForm プロジェクト」を基本として、アプリケーションを発展することも出来ます。当サイトによる制限は無いので、自由に使用してください。

まとめ。

 さぁ、如何でしたでしょうか?。簡単だったでしょうか?、それとも、難しかったでしょうか?

 何方にしても、重要なのは、見ているだけではなく、実際に試して見ることです。自分の目で見て、自分の体で感じて、一歩ずつ前に進みましょう。

 他人の評価も重要ですが、自分の「大志」は更に重要です。失敗したことは、何時か、何かの役に立つ時も来るでしょう。その日まで、頑張りましょう(待てば海路の日和あり)。

 まだまだ、「天文学的」に難しいことは、星の数ほどあります。しかしそれ等は、この基本的なことの「積み重ね」だと思います。

 それでは、この辺でごきげんよう。(^_^)/

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次