如何使用 sender arg 在 C# 中访问 2D 数组中的 i&j?



我有这样的代码:

Label[,] Cell = new Label[8, 8];
for (int i = 0; i < 8; i++)
{
    for (int j = 0; j < 8; j++)
    {    
        Cell[i, j] = new Label();
        Cell[i, j].Text = (i + 1) + "" + (j + 1);
        Cell[i, j].Location = new Point(j * 50 + 25, i * 50 + 25);
        this.Controls.Add(Cell[i, j]);                    
        Cell[i, j].Click += new System.EventHandler(lbl_click);
    }
}
public void lbl_click(object sender, EventArgs e)
{
//I want having i & j here and work with them.
}

如何从单击事件处理程序中访问ij变量?

使用 Tag 属性

一种选择是将需要使用的数据Tag标签。

例如,创建一个类来保存数据...

class TagData
{
    public int I { get; set; }
    public int J { get; set; }
}

在你的循环中...

Cell[i, j].Tag = new TagData() { I = i, J = j };

在事件处理程序中...

public void lbl_click(object sender, EventArgs e)
{
    Label label = sender as Label;
    TagData tagData = label.Tag as TagData;
    // Do something with tagData.I and tagData.J
}

分析标签文本

如果您可以假设 ij 都不会超过一位数,那么您可以简单地解析Text。这样:

public void lbl_click(object sender, EventArgs e)
{
    Label label = sender as Label;
    int i = int.Parse(label.Text[0]) - 1;
    int j = int.Parse(label.Text[1]) - 1;
}

注意:每个数字超过一个数字的危险在于,如果没有分隔符,您将无法知道"123"i = 1还是i = 12。当然,您可以使用分隔符来解决此问题,例如"12,3"但我不建议使用依赖于特定 UI 设计/格式的代码。

好的,

感谢 musefan,这是将坐标存储在标签标签中的解决方案。Winforms控件具有一个名为Tag的属性,您可以在其中存储相关信息。

Label[,] Cell = new Label[8, 8];
for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
            {    
                Label tempLabel = new Label();
                Cell[i,j] = tempLabel;
                tempLabel.Text = (i + 1) + "" + (j + 1);
                tempLabel.Location = new Point(j * 50 + 25, i * 50 + 25);
                tempLabel.Click += new System.EventHandler(lbl_click);
                tempLabel.Tag = new Tuple<int, int>(i, j);
                this.Controls.Add(tempLabel);
            }
    }
public void lbl_click(object sender, EventArgs e)
    {
             Label label = sender as Label;
             Tuple<int, int> position = label.Tag as Tuple<int, int>;
             if(positon != null)
             {
                 int i = position.Item1;
                 int j = position.Item2;
                 //do whatever with the coordinates
             }
    }

最新更新