У меня есть приложение, разработанное в Visual Studio 2022, которое работает с формами. В этом приложении есть основная форма, из которой можно открывать другие формы. В этой основной форме в верхнем меню есть пункт («Selecao»), который необходимо активировать или деактивировать в зависимости от того, какая форма была открыта.
Например, при открытии формы «Расходы» меню должно быть активировано (включено).
Когда эта дополнительная форма закрыта, меню «Selecao» должно быть отключено. Я могу включить меню, но не могу его отключить. Я попробовал сделать меню главной формы public в файле TelaPrincipal.Designer.cs:
public System.Windows.Forms.ToolStripMenuItem M_Selecao;
Таким образом, я мог бы отключить меню в основной форме при закрытии дополнительной формы, но получаю ошибку:
Для метода или свойства TelaPrincipal.M_Selecao требуется ссылка на объект.
Я также не знаю, как это сделать из основной формы. Может ли кто-нибудь мне помочь?
передача ссылки на родительскую (основную) форму в дочернюю форму может помочь, если вы делаете пункт меню общедоступным, однако передавать весь объект формы будет не так уж и здорово. Просто передайте ссылку на элемент управления (в данном случае пункт меню) в дочернюю форму, а затем отключите ее. Или вы можете создать статический класс для выполнения аналогичных действий с любым элементом управления любой формы.





Настройте событие в каждой дочерней форме следующим образом.
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 уже обновлен. Что делать? Спасибо.
public event OnMenuEnable MenuEnable; должно работать.
Хорошо, Карен. Теперь это сработало. Спасибо.
Хотя я дал свой комментарий по этому вопросу, я чувствую соблазн дать ответ, который даст вам другой способ достичь того, чего вы ожидаете.
Насколько я понимаю, вы пытаетесь включить/отключить весь пункт меню, а не элементы подменю под ним. Кроме того, этот пункт меню уже отключен и будет включен после отображения формы.
В этом случае вы можете создать метод типа ShowExpensesForm(), который будет выглядеть следующим образом:
private void ShowExpensesForm()
{
ExpensesForm frm = new ExpensesForm();
frm.Load += (sndr, args) => selacoToolStripMenuItem.Enabled = true;
frm.FormClosing += (sndr, args) => selacoToolStripMenuItem.Enabled = false;
frm.Show();
}
а затем вы можете вызвать его оттуда, где хотите отобразить форму расходов, например, одним нажатием кнопки или щелчком любого другого пункта меню и так далее.
Обратите внимание: я предположил, что включение и отключение этого пункта меню — это единственное, что вам нужно, когда открывается форма расходов, поэтому я использовал встроенное событие. Однако, если вы хотите сделать гораздо больше, правильно назовите свои события и примените логику в рамках этих определенных событий.
Удачи.
Абхинав. Все работало нормально. Спасибо.
Используйте Свойство или Метод . Следующее может быть интересно: stackoverflow.com/a/69743297/10024425