Не удается найти контекстное меню в коллекции элементов управления

2

У меня есть форма. Эта форма имеет пользовательский контроль. Этот пользовательский элемент управления имеет панель и контекстное меню. Контекстное меню не прикреплено к панели. Существуют и другие элементы управления, которые динамически создаются и добавляются в эту панель. Одним из этих элементов управления является кнопка. Когда вы нажимаете эту кнопку, я устанавливаю свойство 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);
  • 0
    Можете ли вы объяснить, что вы хотите сделать с ContextMenuStrip?
  • 0
    перебирайте дочерние элементы управления и отключайте элементы, к которым у пользователя нет доступа.
Теги:
winforms

3 ответа

1
Лучший ответ

Создайте собственное контекстное меню (SecureContextMenu в моем случае), которое происходит из контекстного меню. Внедрите открытое событие и выполните итерацию по коллекции элементов, отключив элементы, которые не авторизованы.

Обязательно создайте свойство HasBeenOpened и установите его true при первом запуске события open, чтобы вам не приходилось проверять одни и те же элементы управления каждый раз при открытии контекстного меню.

Используйте SecureContextMenu везде, где вы хотите, чтобы элементы контекстного меню были отмечены в списке разрешенных элементов.

  • 1
    Я думаю, что это даже лучше, чем то, что я записал. Отличная работа. :)
3

Как вы правильно заметили, 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.

  • 0
    Это прекрасно работает, если контекстное меню назначено элементу управления через свойство contextmenustrip. В моем случае контекстное меню не назначается элементу управления, пока пользователь не взаимодействует с формой. Мне нужно найти это контекстное меню до любого взаимодействия с пользователем.
  • 1
    В этом случае единственное, о чем я могу думать, - это чтобы ваш базовый класс имел метод для добавления ContextMenuStrip к элементу управления. И в этом методе вы можете манипулировать ContextMenuStrip, как вы хотите.
Показать ещё 1 комментарий
0

Это компонент, а не элемент управления, прикрепленный к форме. Сравните его с другой формой: вы можете вручную. Показать() форму из другой формы, но ни одна из них не будет отображаться друг в друге. Ну, может быть, эта аналогия была не лучшей...: s

  • 0
    Есть ли способ получить в руки этот компонент из базового класса формы?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню