**目标:**而不是编码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)
{
}
}
}
1条答案
按热度按时间ztyzrc3y1#
您可以将按钮的行列信息作为元组存储在'button.Tag'属性中,并为每个按钮添加一个'button_Click'处理程序。
在事件中,您读取元组并获得位置。