

C#でLabelコントロールを以下のように2次元配列に格納しています。

[code]

            this.labels = new Label[8,4];
            for (int i = 0; i < labels.GetLength(0); i++)
            {
                for (int j = 0; j < labels.GetLength(1); j++)
                {
                    this.labels[i,j] = new Label();
    
                    //プロパティ設定
                    this.labels[i,j].Size = new Size(50, 50);
                    this.labels[i,j].Top = 30 + 50 * i;
                    this.labels[i,j].Left = 80 * j + 30;
                    this.labels[i,j].AllowDrop = true;
                    this.labels[i,j].DragEnter += new DragEventHandler(this.label1_DragEnter);
                    this.labels[i,j].DragDrop += new DragEventHandler(this.label1_DragDrop);
    
                    this.panel1.Controls.Add(this.labels[i, j]);
                }
            }
    
[/code]

このラベルをクリックした際にクリックイベントを発生させ、クリックされたラベルのインデックスを取得することは可能でしょうか(上記コードではドラッグドロップイベント設定していますが...)？  
例えばlabels[1,1]がクリックされた場合に、[1,1]というインデックスを取得したいです。  
Senderの中身を見る限り、プロパティで設定した情報はあるのですが、インデックスの情報はありませんでした。


CC BY-SA 4.0
2020-08-08T08:43:52.280
69362
2023-01-20T15:50:36.553
40183
question
c# visual-studio
2次元配列に格納したコントロールをクリックした際のインデックスの取得


まだ`Tag`プロパティを使っていないなら、そのプロパティにインデックス情報を書き込んで使えば良いでしょう。  
[Object](https://docs.microsoft.com/ja-
jp/dotnet/api/system.object?view=netcore-3.1)から派生した型のデータであればユーザーが任意に設定して使うことが出来ます。  
適当なものが無ければ文字列を入れて都度変換するとか、あるいは自作のローカル定義オブジェクトを作っても良いのでは？

[Label クラス](https://docs.microsoft.com/ja-
jp/dotnet/api/system.windows.forms.label?view=netcore-3.1)

> **プロパティ**
>
> Tag
> コントロールに関するデータを格納するオブジェクトを取得または設定します。(継承元[Control](https://docs.microsoft.com/ja-
> jp/dotnet/api/system.windows.forms.control?view=netcore-3.1))

[Control.Tag プロパティ](https://docs.microsoft.com/ja-
jp/dotnet/api/system.windows.forms.control.tag?view=netcore-3.1#System_Windows_Forms_Control_Tag)

> コントロールに関するデータを格納するオブジェクトを取得または設定します。
>
> **注釈**  
>  Object クラスから派生した型は、このプロパティに割り当てることができます。 Tag プロパティが Windows
> フォームデザイナーで設定されている場合は、テキストのみを割り当てることができます。  
>  Tag プロパティの一般的な用途は、コントロールに密接に関連付けられたデータを格納することです。
> たとえば、顧客に関する情報を表示するコントロールがある場合、そのコントロールの Tag プロパティに顧客の注文履歴を含む DataSet
> を格納して、データにすばやくアクセスできるようにすることができます。

こちらは実際の類似の適用例です。  
[C#：8パズルをコントロール配列を使って作ってみる](https://dianxnao.com/8%E3%83%91%E3%82%BA%E3%83%AB%E3%82%92%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E9%85%8D%E5%88%97%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/)

1次元配列としてのインデックスですが、Tagに文字列で格納して使っています。


CC BY-SA 4.0
2020-08-08T09:12:44.833
69364
2020-08-08T09:12:44.833
26370
69362
answer


馬鹿馬鹿しい話かもしれませんが，ハンドラ内で `sender` がどれなのかを調べればよいのではないでしょうか．

[code]

    private void label_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < labels.GetLength(0); i++)
        {
            for (int j = 0; j < labels.GetLength(1); j++)
            {
                if( labels[i,j].Equals( sender ) )
                {
                    MessageBox.Show( i.ToString() + "," + j.ToString() );
                    return;
                }
            }
        }
        MessageBox.Show( "Unknown" );
    }
    
[/code]


CC BY-SA 4.0
2023-01-20T10:16:54.123
93478
2023-01-20T10:16:54.123
52236
69362
answer