【C#】なんでも格納できるTagプロパティの使い方と注意点

C#

Button や Label や ListViewItem など、Windowsフォームアプリケーションのコントロールを扱うためのクラス(Controlクラスを継承するクラス)には、必ずTagプロパティがあります。

Tagプロパティは特に便利な機能の一つです。このプロパティを使うと「コントロールに表示はしないが後で使いたい情報」などアプリケーションの実現に必要な任意のデータを格納できます。

ここでは、Tagプロパティへの情報の格納、それを後で参照する方法、Tagプロパティの注意点を紹介します。

サンプル1:Tagに数値を入れる

ボタンがクリックされた回数をTagプロパティを使用してボタン自身に覚えさせるサンプルです。

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int counter = 0;

            // Tagに情報がある場合
            if (button1.Tag != null)
            {
                // Tagプロパティから前回のクリック回数を取得
                counter = (int)button1.Tag;
            }

            // クリック回数をインクリメント
            counter++;

            // クリック回数を表示
            MessageBox.Show($"クリック回数: {counter}回");

            // クリック回数をTagに記憶
            button1.Tag = counter;
        }
    }
}

サンプル2:TagにDateTime型オブジェクトを入れる

ボタンがクリックされた時間をTagプロパティを使用してボタン自身に覚えさせるサンプルです。

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Tag != null)
            {
                // Tagプロパティから前回のクリック時間を取得して表示
                DateTime lastClicked = (DateTime)button1.Tag;
                MessageBox.Show($"前回のクリック時間: {lastClicked.Hour}:{lastClicked.Minute}:{lastClicked.Second}", "Tagプロパティの情報");
            }
            else
            {
                MessageBox.Show($"前回のクリック時間の情報は、まだありません");
            }

            // 現在の時刻をTagプロパティに更新
            button1.Tag = DateTime.Now;
        }
    }
}

注意点

サンプル1や2の下記処理のように、オブジェクトを現在のクラスより具体的な型にキャストすることを「ダウンキャスト」といいます。

// サンプル1:Tagプロパティから前回のクリック回数を取得
counter = (int)button1.Tag;
// サンプル2:Tagプロパティから前回のクリック時間を取得して表示
DateTime lastClicked = (DateTime)button1.Tag;

このダウンキャストは、不適切に使用するとプログラムにエラーを引き起こす可能性があります。ダウンキャストを行う際には、以下の点に注意してください。

Tagプロパティの使い方を統一する: 「〇〇コントロールのTagプロパティには、この型が入っている」と設計時に決めておくのが良いです。

型安全性の確認: どうしても、ひとつのコントロールのTagプロパティに複数の型を格納したい場合は、キャスト前にオブジェクトが実際にキャストしようとしている型であることを確認して使ってください。

private void button2_Click(object sender, EventArgs e)
{
    if (button1.Tag is int)
    {
        // Tagプロパティから前回のクリック回数を取得
        int counter = (int)button1.Tag;

        // int型の場合の処理
    }
    else if (button1.Tag is DateTime)
    {
        // Tagプロパティから前回のクリック時間を取得して表示
        DateTime lastClicked = (DateTime)button1.Tag;

        // DateTime型の場合の処理
    }
    else
    {
        // 期待しない型の場合の実装
        MessageBox.Show($"button1.Tagに期待しない型が入っていました");
    }
}

まとめ

Tagプロパティの柔軟性は強力ですが、型安全性を確保するためには適切なチェックと処理が必要です。特に初心者の方は、型のチェックとキャストの安全な実践方法を学ぶことが重要です。これにより、より堅牢で安全なアプリケーションを開発することができます。

タイトルとURLをコピーしました