EventHandlers и отправитель - PullRequest
       33

EventHandlers и отправитель

2 голосов
/ 27 апреля 2011

Итак, в моей программе я создал структуру с кнопкой и числовым значением ... вот так

struct box
    {
        public int numberValue;
        public Button button;
    }

Затем я создал двумерный массив этой структуры

box[,] boxes = new box[20, 20];

Теперь я сделал 400 кнопок и назначил их каждому индексу массива ... вот так

        private void createBoxes()
    {
        int positionX;
        int positionY;
        for (int i = 0; i < 20; i++)
        {
            for (int j = 0; j < 20; j++)
            {
                positionX = 20 + (25 * i);
                positionY = 20 + (25 * j);
                boxes[i, j].button = new System.Windows.Forms.Button();
                boxes[i, j].button.Location = new System.Drawing.Point(positionX,positionY);
                boxes[i, j].button.Size = new System.Drawing.Size(25, 25);
                this.Controls.Add(boxes[i, j].button);
                boxes[i, j].button.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
                boxes[i, j].button.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
                boxes[i, j].button.Visible = true;
                boxes[i, j].button.Name = "button";
                boxes[i, j].button.Click += new EventHandler(buttonClick);
            }
        }
    }

Теперь, когда я создаю обработчик событий, я хочу отправить «коробки [i, j]»не просто "коробки [я, j]. кнопка" в любом случае, чтобы сделать это?

Ответы [ 3 ]

4 голосов
/ 27 апреля 2011

За исключением определения собственного анонимного обработчика событий, есть простой способ сделать то, что вы хотите:

boxes[i, j].button.Tag = boxes[i, j];

Затем позже:

private void buttonClick(object sender, EventArgs e)
{
    var box = ((Button)sender).Tag as box;
}
3 голосов
/ 27 апреля 2011

Эту проблему можно решить с помощью анонимного обработчика событий.

var box = boxes[i, j]; // You must use a new variable within this scope
box.button.Click += (obj, args) => buttonClick(box, args);

Это самое быстрое решение с наименьшим количеством кода.Просто имейте в виду, что обработчики анонимных событий печально известны скрытыми ошибками, и примером является назначение новой переменной box .Следующий код будет работать, но независимо от того, какую кнопку вы нажмете, в обработчике будут использоваться последние назначенные значения i и j .

boxes[i,j].button.Click += (obj, args) => buttonClick(boxes[i,j], args);
0 голосов
/ 27 апреля 2011

Нет, это невозможно. Отдельное управление кнопкой - это то, которое вызывает событие, то есть это объект, на который ссылается параметр sender. Массив, который содержит , для кнопки управления не имеет значения.

Такое поведение является второстепенным. Если бы вы захотели изменить свойство кнопки в ответ на нажатие пользователем, это было бы невозможно сделать, если бы вы не знали, какая отдельная кнопка была нажата. Наличие только ссылки на массив, содержащий все кнопки, не даст достаточной информации об отдельной нажатой кнопке.

...