C# 将参数传递给事件处理程序
背景: 为了完成学校的作业,我正在做一个益智游戏。玩家必须创建一个益智游戏并将其保存在文本文件中。首先,播放器输入一行一列的平铺(PictureBox),程序创建2d PictureBox布局。在玩家选择工具(从ImageList中指定图像的按钮)并单击平铺后,图像显示在平铺上 方法:我有一个自定义类,它继承自PictureBox类,并具有属性ToolValue。工具值是玩家选择并添加到该图片框中的工具(指定给工具的常量)。为了加载映像,我创建了一个新的事件处理程序,用于处理PictureBox控件的click事件,并在For循环中具有其他参数。新的事件处理程序在磁贴上加载图像,并将自定义PictureBox(MyPictureBox)类的ToolValue属性设置为常量。我已经创建了一个二维PictureBox类引用数组C# 将参数传递给事件处理程序,c#,windows-forms-designer,C#,Windows Forms Designer,背景: 为了完成学校的作业,我正在做一个益智游戏。玩家必须创建一个益智游戏并将其保存在文本文件中。首先,播放器输入一行一列的平铺(PictureBox),程序创建2d PictureBox布局。在玩家选择工具(从ImageList中指定图像的按钮)并单击平铺后,图像显示在平铺上 方法:我有一个自定义类,它继承自PictureBox类,并具有属性ToolValue。工具值是玩家选择并添加到该图片框中的工具(指定给工具的常量)。为了加载映像,我创建了一个新的事件处理程序,用于处理PictureBox
MyPictureBox[,] Tile;
public void DrawALineOfPictureBoxes(int rowNumber, int columnCount, int rowCount, int leftPosition, int topPosition, int height, int width)
{
Tile = new MyPictureBox[rowCount, columnCount];
for (int colNumber = 0; colNumber < columnCount; colNumber++)
{
Tile[rowNumber, colNumber] = new MyPictureBox();
Tile[rowNumber, colNumber].Left = leftPosition;
Tile[rowNumber, colNumber].Top = topPosition;
Tile[rowNumber, colNumber].Height = height;
Tile[rowNumber, colNumber].Width = width;
Tile[rowNumber, colNumber].BorderStyle = BorderStyle.Fixed3D;
Tile[rowNumber, colNumber].SizeMode = PictureBoxSizeMode.StretchImage;
Tile[rowNumber, colNumber].ToolValue = 0;
Tile[rowNumber, colNumber].Click += new EventHandler((sender,e) => LoadImage_Click(sender, e, rowNumber, colNumber));
this.Controls.Add(Tile[rowNumber, colNumber]);
leftPosition += width;
}
}
/// <summary>
/// Method executes when Generate Button is clicked
/// Method invokes DrawALineOfPictureBoxes method which generates a row of Picture boxes
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
///
private void PictureBoxGenerate_Click(object sender, EventArgs e)
{
try
{
int numRows = int.Parse(txtRowCount.Text);
int numColumns = int.Parse(txtColumnCount.Text);
int leftPos = 400;
int topPos = 120;
int height = 100;
int width = 100;
//loop after each row of picturebox is generated
for (int rowNumber = 0; rowNumber < numRows; ++rowNumber)
{
DrawALineOfPictureBoxes(rowNumber, numColumns, numRows, leftPos, topPos, height, width);
topPos += height;
}
}
catch (FormatException)
{
MessageBox.Show("Please provide valid data for rows and columns (Both must be integers)","Sokoban", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// Method is executed when PictureBox cell is clicked and load image to that picture box through resources
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LoadImage_Click(object sender, EventArgs e, int rowNumber, int colNumber)
{
string Content = rowNumber.ToString() + "," + colNumber.ToString();
Console.WriteLine(Content);
MyPictureBox pictureBox = sender as MyPictureBox;
switch (imageType)
{
case ImageType.None:
//Empty the pictureBox Cell
pictureBox.Image = null;
ToolVal = 0;
break;
case ImageType.Hero:
pictureBox.Image = Properties.Resources.Hero;
ToolVal = 1;
break;
case ImageType.Wall:
pictureBox.Image = Properties.Resources.Wall;
ToolVal = 2;
break;
case ImageType.Box:
pictureBox.Image = Properties.Resources.Box;
ToolVal = 3;
break;
case ImageType.Destination:
pictureBox.Image = Properties.Resources.Destination;
ToolVal = 4;
break;
default:
break;
}
//assigning values to Tile array
Tile[rowNumber,colNumber].ToolValue = ToolVal;
}
MyPictureBox[,]瓷砖;
public void DrawAlineOffPictureBoxs(int rowNumber、int columnCount、int rowCount、int leftPosition、int topPosition、int height、int width)
{
Tile=新的MyPictureBox[行数,列数];
for(int colNumber=0;colNumberLoadImage\u单击(发件人,e,rowNumber,colNumber));
this.Controls.Add(平铺[rowNumber,colNumber]);
leftPosition+=宽度;
}
}
///
///方法在单击“生成”按钮时执行
///方法调用DrawAlineOffPictureBoxs方法,该方法生成一行图片框
///
///
///
///
///
私有void PictureBoxGenerate\u单击(对象发送方,事件参数e)
{
尝试
{
int numRows=int.Parse(txtRowCount.Text);
int numColumns=int.Parse(txtColumnCount.Text);
int-leftPos=400;
int-topPos=120;
整数高度=100;
整数宽度=100;
//生成每行picturebox后循环
对于(int rowname=0;rowname
问题:我已将pictureBox的行数和列数作为参数传递给加载图像的EventHandler。在事件处理程序中,开关循环检查单击了哪个工具,并相应地将常量分配给toolValue属性。如果单击第一个picturebox,则传递给事件处理程序的参数为0(对于rowNumber)和0(对于colNumber)。事件处理程序参数应相同,但colNumber参数不是0,而是3,即生成的2d pictureBoxes的总列数
这里是输出>>您的问题在下面一行:
Tile[rowNumber, colNumber].Click += new EventHandler((sender,e) => LoadImage_Click(sender, e, rowNumber, colNumber));
您正在使用传递rowNumber和colNumber的lambda表达式。
触发磁贴的Click事件时,将执行lambda并传递rowNumber和colNumber当时的值(而不是创建事件处理程序时的值)。因为循环已运行到完成,所以传递的colNumber值始终为3
因此,您需要另一种机制来计算单击的平铺的行和列。
您可以根据传递的发送方执行此操作:将其投射到平铺,检索其位置
Tile = new MyPictureBox[rowCount, columnCount];
for (int colNumber = 0; colNumber < columnCount; colNumber++)
{
int actualColumn = colNumber;
int actualRow = rowNumber;
Tile[rowNumber, colNumber] = new MyPictureBox();
...
Tile[rowNumber, colNumber].Click += new EventHandler((sender,e) => LoadImage_Click(sender, e, actualRow, actualColumn));
this.Controls.Add(Tile[rowNumber, colNumber]);
leftPosition += width;
}
//Shared handler for OK, Apply and Cancel Buttons
if(sender == btnOK || sender == btnApply){
}
if(sender == btnOK || sender == btnCancel){
}
PictureBox source = (PictureBox)sender;
source.ImageLocataion = "clicked.png";