はじめに
Windows Forms の MonthCalendar は CalendarDimensions プロパティで、横×縦に複数月を並べて表示できます。本記事では「表示が崩れないサイズ調整」「よく使う並び(1×1/2×1/2×2)」を、最小コードで実現するコツをまとめます。
説明
CalendarDimensions は Size(例:new Size(2,1))で月の並び数を指定します。
注意点はコントロールの実サイズが足りないと希望どおりの月数が出ないこと。フォームやコントロールのサイズを月数に応じて広げるのが定石です(下のサンプル参照)。
ベストプラクティス:
・並び変更時にフォームのクライアントサイズを月数ベースで調整(ざっくりの計算でOK)。
・Dock = Fill でカレンダーに最大領域を割り当てる。
・複数月表示+範囲選択系(MaxSelectionCount)と組み合わせると、週間/月間の把握が容易。
サンプルコード(極力短く)
1×1 / 2×1 / 2×2 をワンクリックで切替。月数に応じてフォームをざっくりリサイズします。
using System;
using System.Drawing;
using System.Windows.Forms;
class MainForm : Form
{
MonthCalendar cal = new MonthCalendar { Dock = DockStyle.Fill };
public MainForm()
{
Text = "MonthCalendar - CalendarDimensions";
var panel = new FlowLayoutPanel { Dock = DockStyle.Top, AutoSize = true };
var b11 = new Button { Text = "1×1" };
var b21 = new Button { Text = "2×1" };
var b22 = new Button { Text = "2×2" };
b11.Click += (s, e) => SetDims(1, 1);
b21.Click += (s, e) => SetDims(2, 1);
b22.Click += (s, e) => SetDims(2, 2);
panel.Controls.AddRange(new Control[] { b11, b21, b22 });
Controls.Add(cal);
Controls.Add(panel);
Load += (s, e) =%gt; SetDims(2, 1); // 既定を 2×1 に
}
// 月数に合わせてフォームをざっくり拡張(見切れ防止の最低限)
void SetDims(int cols, int rows)
{
cal.CalendarDimensions = new Size(cols, rows);
// おおよその必要サイズ(1カ月あたり 240×200 を想定)
var w = Math.Max(360, cols * 240 + 40);
var h = Math.Max(260, rows * 200 + 100);
ClientSize = new Size(w, h);
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new MainForm());
}
}
つまづきポイント
1) 指定した月数が出ない
コントロール領域が不足すると自動的に縮退します。CalendarDimensions 設定後にフォーム(または親コンテナ)のサイズを広げましょう。
2) AutoSize だけでは足りない
実サイズが優先されます。Dock = Fill と、月数に応じた最小サイズ確保(本サンプルの簡易リサイズ)をセットで。
3) 文字スケール/フォントで崩れる
DPI/フォント変更で必要面積は変わります。係数(240×200)はあくまで目安。実アプリでは係数を調整するか、テスト端末で余裕を見てください。
まとめ
CalendarDimensions は複数月表示を簡単に実現できます。肝はサイズの確保。切替時にフォームを広げるだけで、1×1/2×1/2×2 など実用的なレイアウトをすぐに導入できます。予定表・予約画面などで見通しが大きく向上します。

コメント