Вызов WinForms contextmenustrip программно - PullRequest
3 голосов
/ 27 марта 2010

Я программно создаю Picture Box в программе c # windows. Я назначаю его значением для свойства Tag. Я хотел бы распечатать этот номер тега программно, только для целей тестирования. поэтому я пытаюсь это:

private void Form1_Load(object sender, EventArgs e)
{
    pic.ContextMenuStrip = contextMenuStrip1;
    pic.ContextMenuStrip.Click += new EventHandler(this.MyPicHandler);
}

void MyPicHandler(object sender, EventArgs e)
{
    PictureBox pic = sender as PictureBox;

    MessageBox.Show(pic.Tag.ToString());
}

Но когда я щелкаю правой кнопкой мыши на картинке и нажимаю на пункт меню, это дает мне исключение. "Исключение NullReferenceException было обработано" "Ссылка на объект не установлена ​​для экземпляра объекта." У кого-нибудь есть идеи, что происходит?

Ответы [ 2 ]

2 голосов
/ 27 марта 2010

Линия

PictureBox pic = sender as PictureBox;

устанавливает для pic значение null, поскольку это обработчик событий для ContextMenuStrip, а не для PictureBox.

Параметр sender является ссылкой на объект, к которому вы добавили обработчик событий - это ContextMenuStrip.

0 голосов
/ 27 марта 2010

Похоже, что pic.Tag имеет значение null, поэтому .ToString вызывает исключение. Вы должны сделать это:

if(pic.Tag != null)
    MessageBox.Show(pic.Tag.ToString());

Убедитесь, что вы устанавливаете тег для чего-то еще, например, в Form1_Load:

pic.Tag = someValue;
...