我有这样的代码:
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.
}
如何从单击事件处理程序中访问i
和j
变量?
使用 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
}
分析标签文本
如果您可以假设 i
或 j
都不会超过一位数,那么您可以简单地解析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
}
}