【发布时间】:2021-11-29 01:06:31
【问题描述】:
很高兴知道我刚刚开始编程,所以请放轻松;)
在我的程序中,我制作了一个由几个按钮 (btn[i, j]) 组成的板,我使用两个 for 循环来创建它。这些按钮被赋予一个坐标对/索引[i, j],然后我将它传递给一个名为valueBtn 的二维数组,并在相应的索引上为该坐标对赋予一个值。
public void board(object obj, EventArgs ea)
{
int n = 6;
Button[,] btn = new Button[n, n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
int p = 60 * i + 100;
int q = 60 * j + 100;
btn[i, j] = new Button();
btn[i, j].Location = new Point(p, q);
btn[i, j].Size = new Size(60, 60);
int[,] valueBtn = new int[n, n];
valueBtn[i, j] = 0;
this.Controls.Add(btn[i, j]);
}
}
btn[i, j].Click += btnPress;
}
接下来我有一个新方法btnPress,它链接到EventHandler btn[i, j].Click。目的是在这个方法中我找出哪个按钮被按下了,哪个坐标/索引属于这个,这样我就可以在二维数组valueBtn中找到对应的值,并最终在一个新函数@987654328中绘制这个值@。
public void btnPress(object sender, EventArgs ea)
{
Button pressedBtn = sender as Button;
// Here I want to know which button is pressed and the index [i,j] of the button
// so that I can find the value that belongs to the button in the 2d valueBtn array
.
.
.
this.Paint += drawValue;
}
我已经尝试了很多对 EventHandler 的引用,但我就是想不通。
非常感谢您的宝贵时间和帮助!
【问题讨论】:
-
查看
Tag属性,您可以将数据存储在其中,然后在需要时将其取出。或者创建一个新类,继承TextBox在该新类中创建一个新属性并随时设置和获取它。只是几个选项,还有其他方法。 -
感谢您的评论@zaggler! Tag 属性听起来对我很有用,在这种情况下如何正确应用它?
-
您的代码存在一些问题。您的
valueBtn变量在嵌套循环的局部范围内声明。所以你不能从那个本地数组中得到任何值(n x n 数组,它们的所有元素都是 0)。此外,您每次点击任何按钮都订阅Paint事件。你想达到什么目的? -
好评@Steeeve!如果我在班级顶部声明
valueBtn是否足以解决问题?此外,棋盘必须作为棋盘游戏的一种基础,因此当按下按钮时(并且移动是合法的),实际上每次点击按钮都必须绘制。 -
在全局范围内移动 valueBtn 是第一步。但是如果你想在 Paint 事件处理程序中自己绘制一些东西,你只需要订阅一次 Paint 事件或重写 OnPaint 方法。在 btnPress 中,您只需要请求重绘,例如通过调用 Invalidate。
标签: c# arrays button event-handling