У меня есть форма. Эта форма имеет пользовательский контроль. Этот пользовательский элемент управления имеет панель и контекстное меню. Контекстное меню не прикреплено к панели. Существуют и другие элементы управления, которые динамически создаются и добавляются в эту панель. Одним из этих элементов управления является кнопка. Когда вы нажимаете эту кнопку, я устанавливаю свойство contextmenustrip в свое контекстное меню.
Моя проблема в том, что мне нужно прочитать элементы в этом контекстном меню до того, как появилась возможность подключить контекстное меню к кнопке.
Каждый раз, когда форма загружается, я повторяю все дочерние элементы формы. Если у элемента управления есть дети, я перебираю их и т.д.... Кажется, я не вижу контекстного меню, которое так не указано. Он не привязан к какому-либо контролю, поэтому он не является дочерним элементом управления любыми элементами управления в форме.
myConectMenu никогда не добавляется в пользовательский код, как this.Controls.Add(myConectMenu). Как это контекстное меню не может быть вложено в коллекцию управления формами? Как я могу попасть в это контекстное меню?
Вот код дизайнера:
private System.Windows.Forms.ContextMenuStrip myContextMenu;
void InitializeComponent()
{
this.myContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
this.myContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.myToolStripMenuItem1,
this.myToolStripMenuItem2});
this.myContextMenu.Name = "myContextMenu";
this.myContextMenu.Size = new System.Drawing.Size(158, 92);
}
Обновление Итерация управления происходит в базовом классе, из которого выводятся все формы в моем приложении.
Существует объект частных компонентов, к которому добавлен myContextMenu. Я предполагаю, что это так, чтобы вы могли видеть контекстное меню в представлении дизайна, когда оно не привязано к элементу управления. Возможно, я мог бы использовать это?
private System.ComponentModel.IContainer components = null;
this.myContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
Создайте собственное контекстное меню (SecureContextMenu в моем случае), которое происходит из контекстного меню. Внедрите открытое событие и выполните итерацию по коллекции элементов, отключив элементы, которые не авторизованы.
Обязательно создайте свойство HasBeenOpened и установите его true при первом запуске события open, чтобы вам не приходилось проверять одни и те же элементы управления каждый раз при открытии контекстного меню.
Используйте SecureContextMenu везде, где вы хотите, чтобы элементы контекстного меню были отмечены в списке разрешенных элементов.
Как вы правильно заметили, myContextMenu не добавляется в соединение Controls. Элемент управления имеет свойство ContextMenuStrip, которое вы должны проверить.
public void FindContextMenuStrip(Control input)
{
foreach(Control control in input.Controls)
{
if(control.ContextMenuStrip != null)
DoSomethingWithContextMenuStrip(control.ContextMenuStrip)
if(control.Controls.Count > 0)
FindContextMenuStrip(control);
}
}
Поместите соответствующий код в метод DoSomethingWithContextMenuStrip.
EDIT:
Я увидел ваш комментарий, где вы указали, что хотите сделать с ContextMenuStrip.
Как насчет создания метода в базовом классе, который принимает данные пользователя и создает полосу контекстного меню?
public ContextMenuStrip GetContextMenuStripForUser(User user)
{
//code to create context menu strip, with only those items enabled for which user has access.
}
В вашей окончательной форме используйте этот метод, чтобы получить ContextMenuStrip.
Это компонент, а не элемент управления, прикрепленный к форме. Сравните его с другой формой: вы можете вручную. Показать() форму из другой формы, но ни одна из них не будет отображаться друг в друге. Ну, может быть, эта аналогия была не лучшей...: s