Фон: Для школьного задания я делаю игру-головоломку. Игрок должен создать игру-головоломку и сохранить ее в текстовом файле. Сначала игрок вводит строки и столбцы тайлов (PictureBoxes), программа создает 2d макет PictureBox. После чего игрок выбирает инструмент (кнопка, назначенная изображение из ImageList) и нажимает на плитку, изображение появляется на плитке.
Подход: у меня есть собственный класс, который наследуется от класса PictureBox и имеет свойство ToolValue. ToolValue - это инструмент (постоянная, назначаемая инструменту), выбранный игроком и добавленный в этот PictureBox. Для загрузки изображения я создал новый обработчик событий, который обрабатывает событие click элемента управления PictureBox и имеет дополнительные параметры внутри цикла for. Новый обработчик событий загружает изображение на плитку и устанавливает постоянное значение свойства ToolValue пользовательского класса PictureBox (MyPictureBox). Я создал двумерный массив ссылок на класс 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;
}
Проблема: я передал номер строки и столбца pictureBox, который щелкается в качестве параметра для EventHandler, который загружает изображение. Внутри обработчика событий цикл переключения проверяет, какой инструмент был выбран, и соответственно присваивает константу свойству toolValue. Если я нажимаю на первое поле рисунка, параметры, передаваемые обработчику событий, равны 0 для rowNumber и 0 для colNumber. Параметры обработчика событий должны быть одинаковыми, но аргумент colNumber не равен 0, а равен 3, т.е. общее количество столбцов сгенерированных 2d pictureBox.
Вот результат >> >> 1008 * Число равно 3