c# - 如何使用for循环将多个按钮订阅到一个事件
问题描述
当我尝试使用按钮列表和 for 循环将列表中的选择性按钮订阅到事件时,错误“非静态字段、方法或属性需要对象引用”GamePage.ChessBlock_clicked(object, RoutedEventArgs)' 出现,我不知道如何解决这个问题,我只需要让每个选择性按钮都能够在单击它们时访问“chessBlock_clicked”方法。帮助将不胜感激,谢谢。
static List<Button> buttons = new List<Button>();
public void ListofBlocks()
{
Button[] Blocks =
{
Block1, Block2, Block3, Block4, Block5, Block6, Block7, Block8, Block9, Block10,
Block11, Block12, Block13, Block14, Block15, Block16, Block17, Block18, Block19, Block20,
// and more blocks
};
buttons.AddRange(Blocks);
}
public static void Determine_turn()
{
for (int i = 0; i < buttons.Count; i++)
{
ChessPiece piece = (ChessPiece)buttons[i].Tag;
if (Global.Turn == "white")
{
if (piece == ChessPiece.WPawn || piece == ChessPiece.WKnight || piece == ChessPiece.WRook || piece == ChessPiece.WBishop || piece == ChessPiece.WQueen || piece == ChessPiece.WKing)
{
buttons[i].Click += ChessBlock_clicked; // error occurs here
}
}
else if (Global.Turn == "black")
{
}
}
}
private void ChessBlock_clicked(object sender, RoutedEventArgs e)
{
if (sender is Button btn)
{
ChessPiece piece = (ChessPiece)btn.Tag;
Global.SelectedPiece = piece.ToString();
int index;
Button destination = null;
switch (piece)
{
case ChessPiece.WPawn:
textBox3.Text = "W pawn";
index = buttons.IndexOf(btn);
destination = buttons[(index + 8) % buttons.Count];
Global.SelectedBtn = buttons[(index) % buttons.Count];
destination.Click += destination_clicked;
break;
// and other cases
}
}
}
解决方案
这是一种静态方法。ChessBlock_clicked
不是。静态方法不能调用实例(非静态)方法。
有几种方法可以解决这个问题。最简单的是,如果这个方法需要访问一个非静态方法,它不应该是静态的。
推荐阅读
- css - 如何仅使用一个元素 - div 制作图片?
- vue.js - 显示存储在我的后端服务器上的图像
- amazon-web-services - 如何跨账户访问 Lambda 函数?
- windows - 关闭日志记录窗口
- javascript - 如何在 html 中显示 res.write()
- firebase - 如何使用 express 框架在同一个 firebase 项目托管下托管多个站点
- javascript - 如何使用 nodeJS 和 Puppeteer 解决“目标关闭”错误?
- c++ - C ++中_kbhit的替代函数?
- python - 在 Pandas DataFrames 中使用 count.values 和/或 sort.values 对每个给定类别的值进行排序
- python - 如何在 keras 中使用预训练的 googlenet 和 alexnet