前回の記事では、Windows FormsアプリケーションでリボンコントロールとSPREADコントロールをフォームに配置してから関連付けする方法と、新旧スタイルシステムでのリボンコントロールの表示の違いや拡張シェイプエンジンを有効にした時の違いについて解説しました。
今回の記事では、作成したExcelライクなUIを持つWindows Formsアプリケーションを使用して、リボンコントロールの動作の仕組みや、リボンコントロールをカスタマイズする方法について紹介します。
目次
リボンコントロールの動作はコマンドで処理
リボンコントロールに表示される項目はコマンドという形で管理されており、項目をクリックした時はコマンドが実行されます。アプリケーション側では以下の2つのイベントが発生するので、その中でコマンドを特定してデフォルトの動作をキャンセルしたり変更したりできます。
イベント名 | 概要 |
---|---|
CommandExecutingイベント | リボン項目の対応するコマンドが実行されるときに発生 |
CommandExecutedイベント | リボン項目の対応するコマンドが実行されたときに発生 |
CommandExecutingイベント
リボンコントロールの項目の対応するコマンドが実行されるときに発生します。コマンドの実行前になるためデフォルトの動作をキャンセルすることも可能です。
ここではセル範囲のフォントをリボンコントロールの項目から変更するというシナリオを例に実装してみます。リボンコントロールの項目からフォントを変更するときはFontName
コマンドが発生します。
コマンド名 | 概要 |
---|---|
FontName | セルのフォント名を設定します。 |
実装方法は、リボンコントロールとSPREADコントロールの関連付けを行い、CommandExecuting
イベントをハンドリングします。
private void Form1_Load(object sender, EventArgs e)
{
// リボンコントロールとSPREADコントロールの関連付け
ribbonBar1.Attach(fpSpread1);
// テストデータ
fpSpread1.AsWorkbook().ActiveSheet.SetValue(0, 0, "製品名");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(0, 1, "カテゴリ");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(0, 2, "単価");
// CommandExecutingイベントをハンドル
ribbonBar1.CommandExecuting += RibbonBar1_CommandExecuting;
}
private void RibbonBar1_CommandExecuting(object sender, GrapeCity.Spreadsheet.WinForms.Ribbon.ExecuteCommandEventArgs e)
{
// フォントをリボン項目から変更
if (e.CommandName == "FontName")
{
Console.WriteLine("CommandName: " + e.CommandName + ", Parameter: " + e.Parameter);
}
}
アプリケーションを実行します。ワークシートのセル「A1」~「C1」を選択し、リボンメニューから[ホーム]-[フォント]からフォントをメイリオに変更します。
変更すると以下のような出力が得られます。
CommandName: FontName, Parameter: メイリオ
CommandExecutedイベント
リボンコントロールの項目の対応するコマンドが実行されたときに発生します。コマンドの実行後になるため、どのような操作を行われたかを把握したい時や追加の独自処理を行いたい時に有効です。呼び出されるコマンドはCommandExecuting
イベントと同じものになります。
ここではリボンコントロールの項目からセル範囲のフォントを変更した時に、セル範囲の背景色を変更する処理を実装してみます。
private void Form1_Load(object sender, EventArgs e)
{
// リボンコントロールとSPREADコントロールの関連付け
ribbonBar1.Attach(fpSpread1);
// テストデータ
fpSpread1.AsWorkbook().ActiveSheet.SetValue(0, 0, "製品名");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(0, 1, "カテゴリ");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(0, 2, "単価");
// CommandExecutingイベントをハンドル
ribbonBar1.CommandExecuting += RibbonBar1_CommandExecuting;
// CommandExecuted
ribbonBar1.CommandExecuted += RibbonBar1_CommandExecuted;
}
private void RibbonBar1_CommandExecuting(object sender, GrapeCity.Spreadsheet.WinForms.Ribbon.ExecuteCommandEventArgs e)
{
// フォントをリボン項目から変更
if (e.CommandName == "FontName")
{
Console.WriteLine("CommandName: " + e.CommandName + ", Parameter: " + e.Parameter);
}
}
private void RibbonBar1_CommandExecuted(object sender, GrapeCity.Spreadsheet.WinForms.Ribbon.ExecuteCommandEventArgs e)
{
// フォントをリボン項目から変更
if (e.CommandName == "FontName")
{
// セル範囲に灰色を設定
GrapeCity.Spreadsheet.Color color = GrapeCity.Spreadsheet.Color.FromKnownColor(GrapeCity.Core.KnownColor.LightBlue);
fpSpread1.AsWorkbook().ActiveSheet.Selection.Interior.Color = color;
}
}
アプリケーションの実行後にセル「A1」~「C1」を選択し[ホーム]-[フォント]からフォントをメイリオに変更すると、フォントが変更され同時にセル範囲の背景色も変更されます。
リボンコントロールのカスタマイズ
リボンコントロールのデフォルトのタブ、グループおよび項目を非表示/無効化にすることや、新たにタブ、グループおよび項目を追加することが可能です。リボンコントロールは以下のようなオブジェクト構造になっており、各オブジェクト単位で非表示/無効化または追加ができます。
- リボンコントロール
- タブ
- グループ
- 項目
- グループ
- タブ
タブ、グループおよび項目の非表示/無効化
タブ、グループおよび項目の非表示/無効化するには、各オブジェクトのVisible
プロパティおよびEnabled
プロパティをfalse
に設定します。
private void Form1_Load(object sender, EventArgs e)
{
// リボンコントロールとSPREADコントロールの関連付け
ribbonBar1.Attach(fpSpread1);
// [ホーム]タブ以外を非表示
for (int i = 1; i < ribbonBar1.Tabs.Count; i++)
{
ribbonBar1.Tabs[i].Visible = false;
}
// [ホーム]タブの[フォント]グループ以外を無効化
for (int i = 0; i < ribbonBar1.Tabs["Home"].Groups.Count; i++)
{
if (ribbonBar1.Tabs["Home"].Groups[i].Name == "Font")
continue;
ribbonBar1.Tabs["Home"].Groups[i].Enabled = false;
}
}
[ホーム]タブ以外のタブが非表示になり、[ホーム]タブにある[フォント]グループ以外のグループが無効化されていることが分かります。
新しいタブ、グループおよび項目を追加
リボンコントロールにはRibbonTab
クラス、RibbonGroup
クラス、RibbonItem
クラスが用意されており、新しいタブ、グループおよび項目を追加する場合に使用します。なお、CommandExecuting
イベントのイベント引数であるHandled
プロパティはデフォルトでfalse
になっています。コマンドが実行された場合にはブール値をtrue
にすることでCommandExecuted
イベントが発生するようになります。
private void Form1_Load(object sender, EventArgs e)
{
// リボンコントロールとSPREADコントロールの関連付け
ribbonBar1.Attach(fpSpread1);
// 新しいタブを追加
ribbonBar1.Tabs.Insert(0, new GrapeCity.Spreadsheet.WinForms.Ribbon.RibbonTab());
ribbonBar1.Tabs[0].Text = "新しいタブ";
// 新しいグループを追加
ribbonBar1.Tabs[0].Groups.Add(new GrapeCity.Spreadsheet.WinForms.Ribbon.RibbonGroup());
ribbonBar1.Tabs[0].Groups[0].Text = "新しいグループ";
// 新しい項目を追加
ribbonBar1.Tabs[0].Groups[0].Items.Add("新しい項目");
ribbonBar1.Tabs[0].Groups[0].Items[0].CommandName = "NewItem";
// CommandExecutingイベントをハンドル
ribbonBar1.CommandExecuting += RibbonBar1_CommandExecuting;
// CommandExecutedイベントをハンドル
ribbonBar1.CommandExecuted += RibbonBar1_CommandExecuted;
}
private void RibbonBar1_CommandExecuting(object sender, GrapeCity.Spreadsheet.WinForms.Ribbon.ExecuteCommandEventArgs e)
{
// 新しい項目が実行されるとき
if (e.CommandName == "NewItem")
{
Console.WriteLine("CommandExecuting: " + e.CommandName);
// 項目が実行されたことを通知
e.Handled = true;
}
}
private void RibbonBar1_CommandExecuted(object sender, GrapeCity.Spreadsheet.WinForms.Ribbon.ExecuteCommandEventArgs e)
{
// 新しい項目が実行されたとき
if (e.CommandName == "NewItem")
{
Console.WriteLine("CommandExecuted: " + e.CommandName);
}
}
アプリケーションを実行します。[新しいタブ]を表示して[新しい項目]をクリックします。
クリックすると以下のような出力が得られます。
CommandExecuting: NewItem
CommandExecuted: NewItem
新しい項目に処理を追加
CommandExecuted
イベントをハンドリングして[新しい項目]がクリックされた時の処理を実装していきます。ここでは前回記事の最後に行った「値の追加」、「テーブルスタイルの設定」そして「チャートの挿入」までを実行します。
private void Form1_Load(object sender, EventArgs e)
{
// リボンコントロールとSPREADコントロールの関連付け
ribbonBar1.Attach(fpSpread1);
// 新しいタブを追加
ribbonBar1.Tabs.Insert(0, new GrapeCity.Spreadsheet.WinForms.Ribbon.RibbonTab());
ribbonBar1.Tabs[0].Text = "新しいタブ";
// 新しいグループを追加
ribbonBar1.Tabs[0].Groups.Add(new GrapeCity.Spreadsheet.WinForms.Ribbon.RibbonGroup());
ribbonBar1.Tabs[0].Groups[0].Text = "新しいグループ";
// 新しい項目を追加
ribbonBar1.Tabs[0].Groups[0].Items.Add("新しい項目");
ribbonBar1.Tabs[0].Groups[0].Items[0].CommandName = "NewItem";
// CommandExecutingイベントをハンドル
ribbonBar1.CommandExecuting += RibbonBar1_CommandExecuting;
}
private void RibbonBar1_CommandExecuting(object sender, GrapeCity.Spreadsheet.WinForms.Ribbon.ExecuteCommandEventArgs e)
{
// 新しい項目が実行されるとき
if (e.CommandName == "NewItem")
{
// テストデータ
fpSpread1.AsWorkbook().ActiveSheet.SetValue(0, 0, "製品名");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(1, 0, "果汁100% オレンジ");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(2, 0, "果汁100% グレープ");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(3, 0, "果汁100% レモン");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(4, 0, "果汁100% ピーチ");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(5, 0, "メロンミルクキャンディー");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(6, 0, "バニラクリームアイス");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(7, 0, "チョコクリームアイス");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(8, 0, "バナナキャンディー");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(0, 1, "カテゴリ");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(1, 1, "飲料");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(2, 1, "飲料");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(3, 1, "飲料");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(4, 1, "飲料");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(5, 1, "菓子類");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(6, 1, "菓子類");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(7, 1, "菓子類");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(8, 1, "菓子類");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(0, 2, "単価");
fpSpread1.AsWorkbook().ActiveSheet.SetValue(1, 2, 200);
fpSpread1.AsWorkbook().ActiveSheet.SetValue(2, 2, 200);
fpSpread1.AsWorkbook().ActiveSheet.SetValue(3, 2, 1000);
fpSpread1.AsWorkbook().ActiveSheet.SetValue(4, 2, 1000);
fpSpread1.AsWorkbook().ActiveSheet.SetValue(5, 2, 1600);
fpSpread1.AsWorkbook().ActiveSheet.SetValue(6, 2, 1540);
fpSpread1.AsWorkbook().ActiveSheet.SetValue(7, 2, 1540);
fpSpread1.AsWorkbook().ActiveSheet.SetValue(8, 2, 1200);
// セル範囲を選択
fpSpread1.AsWorkbook().ActiveSheet.Cells["A1:C9"].Select();
// フォントの変更
fpSpread1.AsWorkbook().ActiveSheet.Cells["A1:C9"].Font.Name = "メイリオ";
// テーブルを設定
fpSpread1.AsWorkbook().ActiveSheet.Range("A1:C9").CreateTable(true, null, FarPoint.Win.Spread.TableStyle.TableStyleLight12);
// 列幅を自動調整
fpSpread1.AsWorkbook().ActiveSheet.Columns[0, 2].AutoFit();
// チャートを挿入
FarPoint.Win.Spread.Chart.SpreadChart chart = fpSpread1.ActiveSheet.AddChart(0, 0, typeof(FarPoint.Win.Chart.BarSeries), 500, 270, 370, 10, FarPoint.Win.Chart.ChartViewType.View2D, true);
((FarPoint.Win.Chart.YPlotArea)chart.Model.PlotAreas[0]).Vertical = false;
// 項目が実行されたことを通知
e.Handled = true;
}
}
アプリケーションを実行します。[新しいタブ]を表示して[新しい項目]をクリックすると、以下のように「データ」と「テーブル」そして「チャート」が追加されます。
さいごに
今回は、作成したExcelライクなUIを持つSPREAD for Windows Formsのリボンコントロールをカスタマイズして、独自の処理を実装する方法について紹介しました。
リボンコントロールの機能を活用することで、既存のExcelライクなアプリケーションによりExcelらしいユーザーインターフェースを追加することが可能になります。また、スクラッチでExcelと同等のアプリケーションを容易に作成することもできます。
リボンコントロールを使用したサンプルは、製品サンプルとしても含まれるほか弊社のデモページで公開しています。
Webサイトではトライアル版も公開しておりますので、こちらもご確認ください。
また、ご導入前の製品に関するご相談、ご導入後の各種サービスに関するご質問など、お気軽にお問合せください。個別相談会では技術や製品、移行に関する課題の解決方法のご相談もできますので是非ご活用ください。