Как отключить ToolStripMenuItem в контекстном меню динамически? - PullRequest
2 голосов
/ 14 января 2011

В моем приложении Windows у меня есть контекстное меню с сеткой, проблема в том, что я хочу отключить ToolStripMenuItem в контекстном меню в соответствии с преимуществами пользователя. Как я могу это сделать. я сделал так, но это не работает

private void contextMenuStrip_Machine_Opening(object sender, CancelEventArgs e)
{
    toolStripAuthorize.Enabled = INFOpermission.accessAuthorize;
} 

но это не работает

1 Ответ

6 голосов
/ 14 января 2011

Вам нужно установить toolStripAuthorize.Enabled на true или false.

Я понятия не имею, что такое INFOpermission.accessAuthorize, потому что вы не показали код, которыйопределяет это (enum?), но если это что-то отличное от false, это не сработает так, как вы ожидаете.

Я могу гарантировать, что установка свойства Enabled из ToolStripMenuItem, который вы хотите отключить для false в событии Opening обработчик будет работать .Если это не работает для вас, вы делаете что-то еще неправильно, и вам нужно дать нам больше информации для продолжения.

Если вы застряли, посмотрите пример кода здесь: Какобработать событие открытия ContextMenuStrip


РЕДАКТИРОВАТЬ: Вооружившись новой информацией, предоставленной в комментариях, я теперь выделил источник проблемы.Вы присвоили ContextMenuStrip RowTemplate элемента управления DataGridView и поэтому не можете изменять элементы, содержащиеся в этом контекстном меню, в его методе обработки событий Opening.

Получаетсявыяснилось, что это известная ошибка, которую кто-то решил «по замыслу».Вы можете увидеть исходное сообщение об ошибке здесь, в Microsoft Connect .Данное объяснение состоит в том, что всякий раз, когда создается новая строка на основе RowTemplate (как работает RowTemplate), назначенный вами ContextMenuStrip также клонируется.Это означает, что один и тот же экземпляр контекстного меню не используется для каждой строки, и любые свойства, которые вы пытаетесь установить в элементах меню original , не действуют.

К счастью, он также дает намобходной путь.Как и все события, событие Opening передает фактический экземпляр ContextMenuStrip, который должен быть открыт, как его параметр sender. Это - это контекстное меню, пункты которого вам нужно изменить, чтобы ваши изменения были видны.

Итак, что за код? Это выглядит так:

private void contextMenuStrip_Opening(object sender, CancelEventArgs e)
{
    ContextMenuStrip cmnu = (ContextMenuStrip)sender;
    cmnu.Items[1].Enabled = false;
}

Обратите внимание, что вам придется ссылаться на отдельный пункт меню, который вы хотите изменить, по его индексу.Это просто нулевая позиция элемента в меню, который вы хотите изменить.Вы не можете использовать объект toolStripAuthorize, как пытались сделать раньше, потому что новый экземпляр этого объекта был клонирован для каждого нового экземпляра контекстного меню.

...