Включить или отключить меню в форме из другой формы

У меня есть приложение, разработанное в Visual Studio 2022, которое работает с формами. В этом приложении есть основная форма, из которой можно открывать другие формы. В этой основной форме в верхнем меню есть пункт («Selecao»), который необходимо активировать или деактивировать в зависимости от того, какая форма была открыта.

Например, при открытии формы «Расходы» меню должно быть активировано (включено).

Когда эта дополнительная форма закрыта, меню «Selecao» должно быть отключено. Я могу включить меню, но не могу его отключить. Я попробовал сделать меню главной формы public в файле TelaPrincipal.Designer.cs:

public System.Windows.Forms.ToolStripMenuItem M_Selecao;

Таким образом, я мог бы отключить меню в основной форме при закрытии дополнительной формы, но получаю ошибку:

Для метода или свойства TelaPrincipal.M_Selecao требуется ссылка на объект.

Я также не знаю, как это сделать из основной формы. Может ли кто-нибудь мне помочь?

передача ссылки на родительскую (основную) форму в дочернюю форму может помочь, если вы делаете пункт меню общедоступным, однако передавать весь объект формы будет не так уж и здорово. Просто передайте ссылку на элемент управления (в данном случае пункт меню) в дочернюю форму, а затем отключите ее. Или вы можете создать статический класс для выполнения аналогичных действий с любым элементом управления любой формы.

Abhinav Pandey 26.08.2024 07:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Настройте событие в каждой дочерней форме следующим образом.

public delegate void OnMenuEnable(bool sender);
public event OnMenuEnable? MenuEnable;

В дочерней форме включить.

MenuEnable?.Invoke(true);

Запрещать

MenuEnable?.Invoke(false);

После создания экземпляра дочерней формы подпишитесь на событие ниже.

using (var form = new YourFormName())
{
    form.MenuEnable += OnMenuEnable;
    form.ShowDialog();
}


private void OnMenuEnable(bool sender)
{
    M_Selecao.Enabled = sender;
}

Для каждой дочерней формы подпишитесь на одно и то же событие OnMenuEnable.

Привет, Карен. во второй строке, которую вы написали, "?" выдает ошибку. Он говорит мне использовать C# 8.0 вместо C#7.3. Но мой VS уже обновлен. Что делать? Спасибо.

Ismael 26.08.2024 16:38
public event OnMenuEnable MenuEnable; должно работать.
Karen Payne 26.08.2024 23:27

Хорошо, Карен. Теперь это сработало. Спасибо.

Ismael 27.08.2024 19:59

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

Насколько я понимаю, вы пытаетесь включить/отключить весь пункт меню, а не элементы подменю под ним. Кроме того, этот пункт меню уже отключен и будет включен после отображения формы.

В этом случае вы можете создать метод типа ShowExpensesForm(), который будет выглядеть следующим образом:

private void ShowExpensesForm()
{
    ExpensesForm frm = new ExpensesForm();
    frm.Load += (sndr, args) => selacoToolStripMenuItem.Enabled = true;
    frm.FormClosing += (sndr, args) => selacoToolStripMenuItem.Enabled = false;
    frm.Show();
}

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

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

Удачи.

Абхинав. Все работало нормально. Спасибо.

Ismael 27.08.2024 20:09

Другие вопросы по теме