[C#] SplitContainerでの垂直分割の実装方法

C#でSplitContainerを使用して垂直分割を実装するには、まずWindows Formsアプリケーションを作成し、フォームにSplitContainerコントロールを追加します。

SplitContainerOrientationプロパティをOrientation.Verticalに設定することで、垂直分割が可能になります。

これにより、Panel1Panel2が左右に配置されます。

各パネルには、他のコントロールを追加してレイアウトをカスタマイズできます。

分割バーの位置はSplitterDistanceプロパティで調整可能です。

これにより、ユーザーが分割バーをドラッグしてパネルのサイズを変更できるようになります。

この記事でわかること
  • SplitContainerの基本的な使い方
  • 垂直分割の実装手順
  • パネルのカスタマイズ方法
  • イベントの活用法
  • 応用例による実践的な知識

目次から探す

SplitContainerの基本

SplitContainerとは

SplitContainerは、Windowsフォームアプリケーションにおいて、2つのパネルを分割して表示するためのコントロールです。

ユーザーは、分割バーをドラッグすることで、各パネルのサイズを動的に変更できます。

これにより、異なる情報や機能を同時に表示することが可能になります。

SplitContainerは、特に複雑なユーザーインターフェースを構築する際に便利です。

垂直分割と水平分割の違い

SplitContainerは、パネルを垂直または水平に分割することができます。

以下の表に、両者の違いを示します。

スクロールできます
分割タイプ説明
垂直分割左右に2つのパネルを表示し、分割バーを左右にドラッグしてサイズを調整
水平分割上下に2つのパネルを表示し、分割バーを上下にドラッグしてサイズを調整

SplitContainerのプロパティ

SplitContainerには、さまざまなプロパティがあり、動作や外観をカスタマイズできます。

以下の表に、主要なプロパティを示します。

スクロールできます
プロパティ名説明
Orientation分割の方向を設定(VerticalまたはHorizontal)
SplitterDistance分割バーの位置を設定
IsSplitterFixed分割バーの固定状態を設定(固定するかどうか)
Panel1及びPanel2各パネルのコントロールを取得または設定

これらのプロパティを利用することで、SplitContainerの動作や見た目を柔軟に調整することができます。

垂直分割の実装手順

SplitContainerの追加方法

SplitContainerをフォームに追加するには、Visual Studioのデザイナーを使用します。

以下の手順で追加できます。

  1. ツールボックスから SplitContainer を選択します。
  2. フォーム上にドラッグ&ドロップします。
  3. SplitContainerがフォームに追加され、デフォルトの設定が適用されます。

Orientationプロパティの設定

SplitContainerの分割方向を設定するには、Orientationプロパティを使用します。

以下のサンプルコードでは、SplitContainerを垂直分割に設定しています。

partial class MyForm : Form
{
    private SplitContainer splitContainer;
    public MyForm()
    {
        InitializeComponent();
        
        splitContainer = new SplitContainer();
        splitContainer.Orientation = Orientation.Vertical; // 垂直分割に設定
        this.Controls.Add(splitContainer); // フォームに追加
    }
}

このコードを実行すると、SplitContainerが垂直に分割されます。

SplitterDistanceの調整

SplitterDistanceプロパティを使用して、分割バーの位置を調整できます。

このプロパティは、左側または上側のパネルのサイズを指定します。

以下のサンプルコードでは、分割バーの位置を200ピクセルに設定しています。

partial class MyForm : Form
{
    private SplitContainer splitContainer;
    public MyForm()
    {
        InitializeComponent();
        
        splitContainer = new SplitContainer();
        splitContainer.Orientation = Orientation.Vertical; // 垂直分割に設定
        splitContainer.SplitterDistance = 200; // 分割バーの位置を200ピクセルに設定
        this.Controls.Add(splitContainer); // フォームに追加
    }
}

この設定により、左側のパネルが200ピクセルの幅を持ち、右側のパネルが残りのスペースを占めるようになります。

パネルのカスタマイズ

Panel1とPanel2の役割

SplitContainerには、2つのパネル(Panel1とPanel2)があり、それぞれ異なる役割を持たせることができます。

通常、Panel1にはメニューやツールバーなどのナビゲーション要素を配置し、Panel2にはメインコンテンツや詳細情報を表示します。

これにより、ユーザーは効率的に情報を操作しやすくなります。

コントロールの追加方法

Panel1およびPanel2にコントロールを追加するには、以下の手順を実行します。

以下のサンプルコードでは、Panel1にボタンを、Panel2にテキストボックスを追加しています。

partial class MyForm : Form
{
    private SplitContainer splitContainer;
    public MyForm()
    {
        InitializeComponent();
        
        splitContainer = new SplitContainer();
        splitContainer.Orientation = Orientation.Vertical; // 垂直分割に設定
        splitContainer.SplitterDistance = 200; // 分割バーの位置を200ピクセルに設定
        
        // Panel1にボタンを追加
        Button button = new Button();
        button.Text = "クリック";
        button.Dock = DockStyle.Top; // 上部に配置
        splitContainer.Panel1.Controls.Add(button); // Panel1に追加
        
        // Panel2にテキストボックスを追加
        TextBox textBox = new TextBox();
        textBox.Dock = DockStyle.Fill; // 残りのスペースを占める
        splitContainer.Panel2.Controls.Add(textBox); // Panel2に追加
        
        this.Controls.Add(splitContainer); // フォームに追加
    }
}

このコードを実行すると、Panel1にボタンが、Panel2にテキストボックスが表示されます。

パネルのサイズと位置の調整

各パネルのサイズや位置は、DockプロパティやSizeプロパティを使用して調整できます。

以下のサンプルコードでは、Panel1のサイズを150ピクセルに設定し、Panel2のサイズを自動的に調整しています。

partial class MyForm : Form
{
    private SplitContainer splitContainer;
    public MyForm()
    {
        InitializeComponent();
        
        splitContainer = new SplitContainer();
        splitContainer.Orientation = Orientation.Vertical; // 垂直分割に設定
        splitContainer.SplitterDistance = 150; // Panel1のサイズを150ピクセルに設定
        
        // Panel1にボタンを追加
        Button button = new Button();
        button.Text = "クリック";
        button.Dock = DockStyle.Top; // 上部に配置
        splitContainer.Panel1.Controls.Add(button); // Panel1に追加
        
        // Panel2にテキストボックスを追加
        TextBox textBox = new TextBox();
        textBox.Dock = DockStyle.Fill; // 残りのスペースを占める
        splitContainer.Panel2.Controls.Add(textBox); // Panel2に追加
        
        this.Controls.Add(splitContainer); // フォームに追加
    }
}

この設定により、Panel1は常に150ピクセルの幅を持ち、Panel2は残りのスペースを占めるようになります。

これにより、ユーザーインターフェースが整然とした印象を与えます。

SplitContainerのイベント

SplitterMovedイベントの活用

SplitterMovedイベントは、ユーザーが分割バーを動かした後に発生します。

このイベントを利用することで、分割バーの位置が変更された際に特定の処理を実行することができます。

例えば、分割バーの位置に応じて、パネルの内容を動的に変更することが可能です。

以下のサンプルコードでは、分割バーが動かされた後に、現在の位置を表示するメッセージボックスを表示しています。

partial class MyForm : Form
{
    private SplitContainer splitContainer;
    public MyForm()
    {
        InitializeComponent();
        
        splitContainer = new SplitContainer();
        splitContainer.Orientation = Orientation.Vertical; // 垂直分割に設定
        splitContainer.SplitterMoved += SplitContainer_SplitterMoved; // イベントハンドラを追加
        this.Controls.Add(splitContainer); // フォームに追加
    }
    private void SplitContainer_SplitterMoved(object sender, EventArgs e)
    {
        MessageBox.Show($"分割バーの位置: {splitContainer.SplitterDistance}ピクセル");
    }
}

SplitterMovingイベントの活用

SplitterMovingイベントは、ユーザーが分割バーを動かしている最中に発生します。

このイベントを利用することで、分割バーの動きに応じてリアルタイムで処理を行うことができます。

例えば、分割バーの動きに合わせて、他のコントロールの表示を変更することができます。

以下のサンプルコードでは、分割バーが動いている間に、現在の位置を表示するラベルを更新しています。

partial class MyForm : Form
{
    private SplitContainer splitContainer;
    private Label label;
    public MyForm()
    {
        InitializeComponent();
        
        splitContainer = new SplitContainer();
        splitContainer.Orientation = Orientation.Vertical; // 垂直分割に設定
        splitContainer.SplitterMoving += SplitContainer_SplitterMoving; // イベントハンドラを追加
        
        label = new Label();
        label.Dock = DockStyle.Bottom; // 下部に配置
        this.Controls.Add(label); // フォームに追加
        this.Controls.Add(splitContainer); // フォームに追加
    }
    private void SplitContainer_SplitterMoving(object sender, SplitterCancelEventArgs e)
    {
        label.Text = $"分割バーの位置: {splitContainer.SplitterDistance}ピクセル";
    }
}

イベントハンドラの実装方法

イベントハンドラは、特定のイベントが発生した際に実行されるメソッドです。

SplitContainerのイベントに対してハンドラを実装するには、以下の手順を実行します。

  1. イベントに対応するメソッドを作成します。
  2. SplitContainerのインスタンスに対して、イベントハンドラを追加します。

以下のサンプルコードでは、SplitterMovedイベントとSplitterMovingイベントの両方に対してハンドラを実装しています。

partial class MyForm : Form
{
    private SplitContainer splitContainer;
    private Label label;
    public MyForm()
    {
        InitializeComponent();
        
        splitContainer = new SplitContainer();
        splitContainer.Orientation = Orientation.Vertical; // 垂直分割に設定
        splitContainer.SplitterMoved += SplitContainer_SplitterMoved; // SplitterMovedイベントハンドラを追加
        splitContainer.SplitterMoving += SplitContainer_SplitterMoving; // SplitterMovingイベントハンドラを追加
        
        label = new Label();
        label.Dock = DockStyle.Bottom; // 下部に配置
        this.Controls.Add(label); // フォームに追加
        this.Controls.Add(splitContainer); // フォームに追加
    }
    private void SplitContainer_SplitterMoved(object sender, EventArgs e)
    {
        MessageBox.Show($"分割バーの位置: {splitContainer.SplitterDistance}ピクセル");
    }
    private void SplitContainer_SplitterMoving(object sender, SplitterCancelEventArgs e)
    {
        label.Text = $"分割バーの位置: {splitContainer.SplitterDistance}ピクセル";
    }
}

このように、イベントハンドラを実装することで、SplitContainerの動作に応じた柔軟な処理を行うことができます。

応用例

動的にコントロールを追加する方法

SplitContainer内のパネルに動的にコントロールを追加することができます。

これにより、ユーザーの操作に応じてインターフェースを柔軟に変更できます。

以下のサンプルコードでは、ボタンをクリックすることで、Panel1に新しいラベルを追加しています。

partial class MyForm : Form
{
    private SplitContainer splitContainer;
    private Button addButton;
    private int labelCount = 0; // ラベルのカウント
    public MyForm()
    {
        InitializeComponent();
        
        splitContainer = new SplitContainer();
        splitContainer.Orientation = Orientation.Vertical; // 垂直分割に設定
        
        addButton = new Button();
        addButton.Text = "ラベルを追加";
        addButton.Click += AddButton_Click; // ボタンクリックイベントを追加
        splitContainer.Panel1.Controls.Add(addButton); // Panel1にボタンを追加
        
        this.Controls.Add(splitContainer); // フォームに追加
    }
    private void AddButton_Click(object sender, EventArgs e)
    {
        labelCount++; // ラベルのカウントを増加
        Label newLabel = new Label();
        newLabel.Text = $"ラベル {labelCount}";
        newLabel.Dock = DockStyle.Top; // 上部に配置
        splitContainer.Panel1.Controls.Add(newLabel); // Panel1に新しいラベルを追加
    }
}

このコードを実行すると、ボタンをクリックするたびにPanel1に新しいラベルが追加されます。

パネル間のデータ連携

SplitContainerのPanel1とPanel2間でデータを連携させることも可能です。

例えば、Panel1に入力したテキストをPanel2に表示することができます。

以下のサンプルコードでは、テキストボックスに入力した内容をボタンをクリックすることで、Panel2のラベルに表示しています。

partial class MyForm : Form
{
    private SplitContainer splitContainer;
    private TextBox inputTextBox;
    private Label displayLabel;
    public MyForm()
    {
        InitializeComponent();
        
        splitContainer = new SplitContainer();
        splitContainer.Orientation = Orientation.Vertical; // 垂直分割に設定
        
        inputTextBox = new TextBox();
        inputTextBox.Dock = DockStyle.Top; // 上部に配置
        splitContainer.Panel1.Controls.Add(inputTextBox); // Panel1にテキストボックスを追加
        
        Button displayButton = new Button();
        displayButton.Text = "表示";
        displayButton.Click += DisplayButton_Click; // ボタンクリックイベントを追加
        splitContainer.Panel1.Controls.Add(displayButton); // Panel1にボタンを追加
        
        displayLabel = new Label();
        displayLabel.Dock = DockStyle.Fill; // 残りのスペースを占める
        splitContainer.Panel2.Controls.Add(displayLabel); // Panel2にラベルを追加
        
        this.Controls.Add(splitContainer); // フォームに追加
    }
    private void DisplayButton_Click(object sender, EventArgs e)
    {
        displayLabel.Text = inputTextBox.Text; // テキストボックスの内容をラベルに表示
    }
}

このコードを実行すると、テキストボックスに入力した内容がボタンをクリックすることでPanel2のラベルに表示されます。

SplitContainerをネストする方法

SplitContainerをネストすることで、さらに複雑なレイアウトを作成することができます。

以下のサンプルコードでは、Panel1に別のSplitContainerを追加し、さらにその中で垂直分割を行っています。

partial class MyForm : Form
{
    private SplitContainer mainSplitContainer;
    public MyForm()
    {
        InitializeComponent();
        
        mainSplitContainer = new SplitContainer();
        mainSplitContainer.Orientation = Orientation.Vertical; // メインのSplitContainerを垂直分割に設定
        
        // ネストするSplitContainerを作成
        SplitContainer nestedSplitContainer = new SplitContainer();
        nestedSplitContainer.Orientation = Orientation.Horizontal; // ネストするSplitContainerを水平分割に設定
        
        // メインのPanel1にネストするSplitContainerを追加
        mainSplitContainer.Panel1.Controls.Add(nestedSplitContainer); 
        
        // ネストしたSplitContainerのPanel1にラベルを追加
        Label nestedLabel1 = new Label();
        nestedLabel1.Text = "ネストされたPanel1";
        nestedLabel1.Dock = DockStyle.Fill; // 残りのスペースを占める
        nestedSplitContainer.Panel1.Controls.Add(nestedLabel1); // Panel1にラベルを追加
        
        // ネストしたSplitContainerのPanel2にラベルを追加
        Label nestedLabel2 = new Label();
        nestedLabel2.Text = "ネストされたPanel2";
        nestedLabel2.Dock = DockStyle.Fill; // 残りのスペースを占める
        nestedSplitContainer.Panel2.Controls.Add(nestedLabel2); // Panel2にラベルを追加
        
        this.Controls.Add(mainSplitContainer); // フォームに追加
    }
}

このコードを実行すると、メインのSplitContainerのPanel1にさらにSplitContainerが追加され、上下に分割された2つのラベルが表示されます。

これにより、複雑なレイアウトを簡単に構築することができます。

よくある質問

SplitContainerの分割バーを固定することはできますか?

はい、SplitContainerの分割バーを固定することができます。

IsSplitterFixedプロパティをtrueに設定することで、ユーザーが分割バーを動かせなくなります。

以下のように設定します。

splitContainer.IsSplitterFixed = true; // 分割バーを固定

この設定を行うと、分割バーの位置は変更できなくなり、固定された状態で表示されます。

パネルの初期サイズを設定する方法は?

SplitContainerのパネルの初期サイズは、SplitterDistanceプロパティを使用して設定できます。

このプロパティに値を設定することで、分割バーの初期位置を指定できます。

以下のように設定します。

splitContainer.SplitterDistance = 200; // Panel1の初期サイズを200ピクセルに設定

この設定により、Panel1は200ピクセルの幅を持ち、Panel2は残りのスペースを占めるようになります。

SplitContainerのデザインをカスタマイズするにはどうすればいいですか?

SplitContainerのデザインをカスタマイズするには、以下のプロパティを利用できます。

  • BackColor: SplitContainer全体の背景色を設定します。
  • Panel1及びPanel2のBackColor: 各パネルの背景色を個別に設定できます。
  • SplitterWidth: 分割バーの幅を設定します。
  • BorderStyle: SplitContainerの境界線のスタイルを設定します。

以下のサンプルコードでは、SplitContainerの背景色と分割バーの幅を設定しています。

splitContainer.BackColor = Color.LightGray; // SplitContainerの背景色を設定
splitContainer.SplitterWidth = 5; // 分割バーの幅を5ピクセルに設定
splitContainer.Panel1.BackColor = Color.LightBlue; // Panel1の背景色を設定
splitContainer.Panel2.BackColor = Color.LightGreen; // Panel2の背景色を設定

これらのプロパティを利用することで、SplitContainerの見た目を自由にカスタマイズすることができます。

まとめ

この記事では、C#のWindowsフォームにおけるSplitContainerの基本的な使い方から、応用例まで幅広く解説しました。

特に、SplitContainerを利用した垂直分割の実装手順や、パネルのカスタマイズ、イベントの活用方法について詳しく説明しました。

これを機に、SplitContainerを活用して、より使いやすいユーザーインターフェースを構築してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す