C# 创建同一类的多个按钮

C# 创建同一类的多个按钮,c#,winforms,C#,Winforms,我试图创建一个类ButtonControls的大约25个按钮,这些按钮继承了普通Button类,并使用嵌套的for循环创建一个正方形。我添加了名为coordsX和coordsY的特殊属性,我用来知道它们应该放在表单中的什么位置,以及其他一些太复杂而无法在这里解释的用途。当我创建一个按钮时,它被放置在应该的位置,并以文本的形式写下它的“坐标”,它显示正确的值,但是当我单击它时,messagebox应该弹出并给我这个按钮的坐标,但它总是显示上一个创建的按钮的坐标 private void Creat

我试图创建一个类
ButtonControls
的大约25个按钮,这些按钮继承了普通
Button
类,并使用嵌套的
for
循环创建一个正方形。我添加了名为
coordsX
coordsY
的特殊属性,我用来知道它们应该放在表单中的什么位置,以及其他一些太复杂而无法在这里解释的用途。当我创建一个按钮时,它被放置在应该的位置,并以文本的形式写下它的“坐标”,它显示正确的值,但是当我单击它时,messagebox应该弹出并给我这个按钮的坐标,但它总是显示上一个创建的按钮的坐标

private void CreateBoard()
        {
            for (int x=0;x<BoardWidth;x++)
            {
                for (int y=0;y<BoardHeight;y++)
                {
                    ButtonControls bc = new ButtonControls(x,y,PieceSize);
                    //bc.Name = x+"_"+y;
                    //bc.BackgroundImage = PieceBmp;
                    //bc.Size = new Size(PieceSize,PieceSize);
                    bc.Click += PieceButton_Click;
                    Point docks = new Point(20, 20);
                    docks.Offset(ButtonControls.coordsX, ButtonControls.coordsY);
                    bc.Location = docks;
                    Controls.Add(bc);
                }
            }
        }
单击事件如下所示:

        public ButtonControls (int X,int Y, int ButtonSize)
        {
            coordsX = X*ButtonSize;
            coordsY = Y*ButtonSize;
            Name = X+"."+Y;
            BackColor = Color.White;
            Size = new Size(ButtonSize,ButtonSize);

            Font = new Font("Arial",6);
            Text = coordsX + "." + coordsY;
        }

        public static int coordsX { get; set; }
        public static int coordsY { get; set; }
private void PieceButton_Click (object sender,EventArgs e)
        {
            MessageBox.Show(ButtonControls.coordsX+"/"+ButtonControls.coordsY);
        }

如何使其显示我单击的按钮的坐标?

问题是您的坐标是静态的

移除
静态
ie

public int coordsX { get; set; }
public int coordsY { get; set; }
然后使用
sender
实例而不是类来访问单击事件中的这些属性

private void PieceButton_Click (object sender,EventArgs e)
{
     var button = (ButtonControls)sender;
     MessageBox.Show(button.coordsX+"/"+ button.coordsY);
}

作为旁注,您的类名
ButtonControls
不是很好-为什么是复数
ButtonControl
更好,但它仍然没有描述它与继承自的类之间的差异
PieceButton
甚至更好(我不知道上下文,所以这只是一个猜测),但就我个人而言,我会将其称为
Piece

将您的发送者投射到
BottonControls
以获得点击按钮

然后,要访问您的属性
coordsX,coordsY,
,您必须删除
static
关键字

public int coordsX { get; set; }
public int coordsY { get; set; }

private void PieceButton_Click (object sender,EventArgs e)
{
     var button = (ButtonControls)sender;
     MessageBox.Show(button.coordsX+"/"+ button.coordsY);
}

使用
sender
参数。将其强制转换为
按钮控件