0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Excelアドイン(VSTO)でボタンのイベントを削除して別のボタンに置き換える方法

Last updated at Posted at 2021-01-17

開発環境

  • Windows 10 Home
  • Microsoft Visual Studio Community 2019 Version 16.8.4
  • Microsoft .NET Framework Version 4.8.03752

はじめに

アドインで使用できるUIツールの一つSplitButtonは、上部にボタン、下部にメニュー(なかにボタン配置が可能)という形で構成されています。

ここでは、メニューの中のボタンをクリックしたら、上部のボタンのデザインや挙動を置き換える方法について説明します。

※ 独自のやり方なので、よりよい方法があれば教えてください。

イメージ

splitButton_replace.png

ユースケース

よく使うボタンがメニューのなかにあり、何度もメニューを開いてクリックするのが大変な場合、前回クリックしたボタンを上のボタンに設定しておくことで操作の煩雑さを回避できます。

既存のイベントの削除

SplitButtonにすでに設定されているイベントを削除します。
※ 削除しないとイベントが複数起床してしまいます

いま設定されているイベントを知る術が見つからず、設定されている可能性のあるイベントを片っ端から削除していきます。(もっとスマートにやりたい)
※ 設定されていないものを削除してもエラーにはなりません

splitButton.Click -= button_1_Click;
splitButton.Click -= button_2_Click;
splitButton.Click -= button_3_Click;

新しいボタンへ乗り換える

ここでは、button_1を押されたときを考えます。
必要なプロパティ情報をコピーしましょう。

private void button_1_Click(...)
{
    splitButton.Label = button_1.Label;
    splitButton.Tag = button_1.Tag;
    splitButton.OfficeImageId = button_1.OfficeImageId;
    splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_1_Click);
}

汎用関数を作成する

各ボタンのクリックイベントごとに上記のコードを追加していくのもイマイチなので、抽象化した関数を用意します。

private void changeEvent_splitButton(RibbonSplitButton btnDst, RibbonButton btnSrc)
{
    btnDst.Click -= button_1_Click;
    btnDst.Click -= button_2_Click;
    btnDst.Click -= button_3_Click;

    btnDst.Label = btnSrc.Label;
    btnDst.Tag = btnSrc.Tag;
    btnDst.OfficeImageId = btnSrc.OfficeImageId;
}

各ボタンのクリックイベントからは下記のようにCallします。

private void button_1_Click(...)
{
    changeEvent_splitButton(splitButton, button_1);
    splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_1_Click);
}

選択されたボタンを設定ファイルに保存する方法

ボタンを入れ替えたあと、その状態を次回起動時にも反映させたい場合の方法になります。

設定ファイルに保存する方法は下記を参考にしてください。
Excelアドイン(VSTO)で設定ファイルを扱う方法

  1. メニュー内のボタンそれぞれに**タグ名(Tag)**を付与します。
    内容は何でもよいです。switch文で分岐するために利用します。
  2. 設定ファイルに、**splitButton(名前は何でもよいです)**を追加します

splitButton_tag.png

設定ファイルを読み込みUIに反映する

※ 先ほどの汎用関数を利用します

Properties.Settings setting = Properties.Settings.Default;
switch (setting.splitButton)
{
    case "1":
        changeEvent_splitButton(splitButton, button_1, button_1_Click);
        splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_1_Click);
        break;
    case "2":
        changeEvent_splitButton(splitButton, button_2, button_2_Click);
        splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_2_Click);
        break;
}

UIの状態を設定ファイルに保存する

Properties.Settings setting = Properties.Settings.Default;
setting.splitButton = splitButton.Tag.ToString();
setting.Save();

以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?