如何将按钮的索引传递给 EventHandler?
Posted
技术标签:
【中文标题】如何将按钮的索引传递给 EventHandler?【英文标题】:How to pass an index of a button to an EventHandler? 【发布时间】: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。
【参考方案1】:
您可以设置每个按钮的Text
属性,如btn[i, j].Text = some i j combination
。然后在btnPress
这样的 string s = (sender as Button).Text;
方法中获取它。你也可以使用Tag
属性,所以基本概念是一样的。
【讨论】:
感谢您的评论!是的,我自己也在考虑类似的事情,但我不知道这是否是最“整洁”的解决方案。由于我是新手,对EventHandlers
引用和使用sender
之类的对象没有太多经验,我想我会问。以上是关于如何将按钮的索引传递给 EventHandler?的主要内容,如果未能解决你的问题,请参考以下文章