如何将按钮的索引传递给 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?的主要内容,如果未能解决你的问题,请参考以下文章

类型中缺少索引签名

如何将 ngFor 循环的索引值传递给组件? [复制]

使用 std::vector 时如何将索引信息传递给元素构造函数?

Node.js如何将数组索引传递给异步函数

Bash - 如何将数组传递给函数,并在新函数中定义索引

如何将按钮标签传递给 prepareForSegue