komoto / エンジニアブログ

IT4年目の者がプログラミングやIT技術について情報発信します。

【.NET Core】ToolStripのクリックイベントでItemコンポーネントを取得する

環境

はじめに

下図のようにToolStripコンテナを配置し、その子にボタンを置きました。
そして、そのボタンのクリックイベントを実装しようとしましたが、ToolStripの子であるボタンにはイベントが設定できません。
代わりに、ToolStripのItemClickイベントというものが有効化されますが、引数のsenderにはToolStripが入ってしまいます。
本当はボタンが入っていることを期待していたのに・・・。

f:id:tkmt-hrkz:20200801235347p:plain:w200

そこで、クリックしたボタンを同じItemClickイベントで取得する方法を説明します。
結論から言うと、ToolStrip内のItemを取得することは非常に簡単でした。

e.ClickedItemで取得できる

ボタンなどのクリックされたItemは、イベントハンドラーメソッドの第2引数であるToolStripItemClickedEventArgs eClickedItemプロパティに格納されています。
なので、e.ClickedItemでクリックされたItemを取得できます。

ToolStriptItemClickedEventArgsクラスはその名の通り、コンストラクタにクリックされたItemを受け取りインスタンス生成します。
そして、そのクリックされたItemはClickedItemプロパティに設定されます。
ToolStriptItemClickedEventArgsクラスについて、詳しくは公式ドキュメントをご覧ください。

例えば上の画像のようにToolStrip内に複数ボタンを配置してそれぞれで異なる処理をしたい場合だと

private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    Console.WriteLine(e.ClickedItem.GetType()); //クリックされたItemの型を表示   
    var itemType = e.ClickedItem.GetType();   
    var item = e.ClickedItem as itemType; //クリックされたItemの取得   
    switch (item.Tag) //Itemに設定したTagによって分岐、nameなどでも可   
    {   
        case ○○:   //Itemごとに分岐させ処理する
            break;

        case ○○:   
            break;
    }
}

という風に書けばOKです。