winforms 为所有按钮创建通用按钮单击事件?

i5desfxk  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(110)

**目标:**而不是编码64个buttonX_clicked()事件,我想编码一个buttonHandler(),当任何按钮被点击时调用,并使用按钮的解析位置来采取相应的动作。

**背景:**我正在学习如何在C#中使用.NET Forms,并正在开发一个基本的国际象棋应用程序。我目前的用户界面如上所示,它使用64个单独的按钮,每个董事会的立场之一。我目前使用一个相对丑陋的循环将所有按钮存储在一个数组中,然后根据它们的位置为它们分配一个起始值。
**旁注:**如果唯一的解决方案是编写每个buttonX_clicked()来调用buttonHandler(),那么在Visual Studio中也可以使用一种有效的方法来实现这一点。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace Chess_Test
{
    public partial class UserControl1 : UserControl
    {
        // pawn , knight, bishop, rook, queen, king
        //   1  ,   2   ,   3   ,   4 ,   5  ,  6
        public int[,] nboard = new int[8, 8] {
            { 4, 2, 3, 5, 6, 3, 2, 4 },
            { 1, 1, 1, 1, 1, 1, 1, 1 },
            { 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0 },
            { 1, 1, 1, 1, 1, 1, 1, 1 },
            { 4, 2, 3, 5, 6, 3, 2, 4 }
        };

        Button[] bboard = new Button[64];

        public UserControl1()
        {
            InitializeComponent();
            int i = 0;
            string init = "4235632411111111000000000000000000000000000000001111111142356324";
            foreach (var button in chessPanel.Controls.OfType<Button>())
            {
                if (!button.Name.Contains("usr"))
                {
                    string parsed = Regex.Replace(button.Name, @"[^\d]+", "").Trim();
                    int num = int.Parse(parsed) - 1;
                    bboard[num] = button;
                    button.Text = init[num].ToString();
                }
            }

        }

        private void UserControl1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
ztyzrc3y

ztyzrc3y1#

您可以将按钮的行列信息作为元组存储在'button.Tag'属性中,并为每个按钮添加一个'button_Click'处理程序。
在事件中,您读取元组并获得位置。

{
    if (!button.Name.Contains("usr"))
    {            
        string parsed = Regex.Replace(button.Name, @"[^\d]+", "").Trim();
        int position = int.Parse(parsed) - 1;

         // if % operation = 0, return col 7, otherwise position - 1
        int col = (num % 8) == 0 ? 7 : (num % 8) - 1;

        // if / operation = 8, return row 7, otherwise num / 8
        int row = (num % 8) == 0 ? (num / 8) - 1 : (num / 8); 

        // Add row,col to tag
        button.Tag = new Tuple<int, int>(row, col);
        button.Text = init[position].ToString();

        // Add the handler here
        button.Click += button_Click; 
    }
}      
  
private void button_Click(object sender, EventArgs e)
{ 
    // Get the clicked button
    Button button = (Button)sender;

    // Read the position from the buttons Tag
    Tuple<int, int> position = (Tuple<int, int>)button.Tag;

    // Extract the row and col
    int row = position.Item1;
    int col = position.Item2;

    // get the figure from your array by row / col
    int figure = nboard[row, col];
   
    // ...        

}

相关问题