Передача переменной событию в .NET - PullRequest
1 голос
/ 31 января 2011

Например, у меня есть список графических блоков, которые вызывают событие, когда на них наведен курсор. Тем не менее, мне нужно как-то не только вызвать это событие, но и передать переменную «i», чтобы я знал, на какой картинке находится курсор над ним.

for (int i = 0; i < 25; i++)
{
....
pbList.Add(new PictureBox());

pbList[i].MouseHover += new System.EventHandler(this.beeHideInfo);
                                            //// need to pass "i" here
}

и

    private void beeShowInfo(object sender, EventArgs e)
    {
        lb_beeInfo.Text = "You are hovering over: "+beeList[i].name;
                                               /// need to get this "i"
    }

Есть идеи?

Ответы [ 6 ]

5 голосов
/ 31 января 2011

Нельзя передавать переменные событию.

Кроме того, вам уже передана необходимая переменная: sender.

sender - это ссылка на объект, который вызвалсобытие.В вашем случае это ссылка на PictureBox, которая вызвала событие.

3 голосов
/ 31 января 2011

Параметр object sender равен PictureBox, отправляющему событие.Если вам нужно связать что-то с этим объектом, вы можете использовать его Tag член:

for (int i = 0; i < 25; i++)
{
    ....
    pbList.Add(new PictureBox() { Tag = beeList[i] });
    pbList[i].MouseHover += new System.EventHandler(this.beeHideInfo);
}

и

private void beeShowInfo(object sender, EventArgs e)
{
    PictureBox pb = (PictureBox)sender;
    Bee b = (Bee)pb.Tag;
    lb_beeInfo.Text = "You are hovering over: "+b.name;
}
2 голосов
/ 31 января 2011

Предполагая, что pbList и beelist содержат связанные элементы в одном порядке, вы можете сделать что-то вроде beeList[ pbList.IndexOf(sender) ].name

1 голос
/ 01 февраля 2011

другой способ может быть, если вы создадите пользовательскую картинную рамку

class CustomPictureBox : PictureBox
{
  public int id;
  public CustomPictureBox(int ID)
 {
   id = ID;
 }

}

сначала поместите ГЛОБАЛЬНЫЙ идентификатор в родительский элемент, и каждый раз при нажатии на CustomPicureBox, получите идентификатор чем везде, где вы хотите внести изменения в Clicked CustomPicutreBox протестировать его

foreach(CustomPicutreBox i in Control.controls)
{
  if(i.ID == sender.ID)
  doWhatEveryYouWant(); 
}
}
1 голос
/ 31 января 2011

Самый простой способ сделать это - использовать анонимную функцию для явной передачи экземпляра PictureBox или индекса в обработчик.

for (int i = 0; i < 25; i++)
{
  ....
  var box = new PictureBox();
  pbList.Add(box);
  box.MouseHover += delegate { this.beeShowInfo(box); }
}

private void beeShowInfo(PictureBox box) 
{
   lb_beeInfo.Text = "You are hovering over: "+box.Name;
}
1 голос
/ 31 января 2011

Вы могли бы сделать что-то вроде:

for (int i = 0; i < 25; i++)
{
    ...

    pbList.Add(new PictureBox());

    var index = i;
    pbList[i].MouseHover += 
        delegate
        {
            lb_beeInfo.Text = "You are hovering over: "+beeList[index].name;
        };
}

Т.е. использовать анонимный метод.

Как сказал Джон Сондерс , есть более простое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...