编辑:
我从Jon Skeet先生那里写了这段代码回答: 它有什么错误?因为当我点击它时它什么都不做,谢谢
PictureBox[,] pic = new PictureBox[8, 8];
public PictureBox SetKingImage(int x,int y)
{
pic[x,y].Image=Image.FromFile("pic/siyahsah2.JPG");
return pic[x, y];
}
public void GetClickedPicturebox()
{
int x, y;
for(x=0;x<8;x++)
{
for(y=0;y<8;y++)
{
pic[x, y] = new PictureBox();
pic[x, y].Click += (object sender, System.EventArgs e) =>SetKingImage(x, y);
}
}
}
答案 0 :(得分:3)
最简单的方法是让用户点击相关的图片框。您可以通过以下三种方式之一确定单击哪个PictureBox:
sender
)的引用来查找它是哪一个并正确获取坐标使用封装位置的lambda表达式进行订阅,如下所示:
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
pictureBoxes[x, y].Click += (sender, args) => SetKingPosition(x, y);
}
}
后一种方法的一个问题是,通过lambda表达式从事件中取消订阅相对比较痛苦 - 并且您可能希望在单击第一个按钮时取消订阅所有事件处理程序。
另一种方法是将事件处理程序保留在适当的位置,并在不适合的时候忽略它们:)
答案 1 :(得分:3)
这是一个想法,而不是搞乱大量的PictureBoxes。
创建一个名为ChessBoardControl
的UserControl。 ChessBoardControl
将负责绘制给定的ChessBoard
个对象。
在ChessBoardControl
中,您可以覆盖OnMouseDown
事件,然后从鼠标坐标中轻松计算点击了哪个方格。
答案 2 :(得分:1)
在新代码中,您有两个for
循环遍历 i 和 j ,但在循环中,您总是为pic分配一个事件处理程序[ X,Y]。
所以你只是为pic [0,0]分配一个处理程序。 x 和 y 永远不会改变......
修改强>
坦率地说,我不确定我理解你的代码。您希望GetClickedPicturebox
做什么?你什么时候打电话给它?
如果你打算调用它来获取被点击的PictureBox,那就错了,因为你将事件处理程序附加到新的PictureBox实例,而不是表单上的那些实例。
如果这个方法是一个初始化方法,那么它可能是错误的,因为你只是创建新的PictureBox实例,但是你没有在你的Form上显示它们。如果您的表单上有PictureBox,它们是不同的实例,并且您没有将事件处理程序附加到正确的实例处理器。