#winforms #methods #visible
#winforms #методы #видимый
Вопрос:
привет, у меня есть такие строки кода, что я не могу заставить его работать, цель проста — установить для form1 значение visible = false
public static void DoActions(string Cmd){
if(Cmd == true)
{
MainForm.Visible = false;
}
}
но у меня продолжает возникать эта ошибка
Для нестатического поля, метода или свойства требуется ссылка на объект
обычно я устанавливаю для вызываемого methond значение static .. поэтому ошибка исчезнет, но в этом случае, как мне это сделать?
спасибо за любую помощь, ребята
‘Система.Windows.Формы.Управление.Вызвать (System.Делегировать)’
Ответ №1:
Это происходит потому, что DoActions
это статический метод, а не метод экземпляра, однако MainForm
это поле / свойство экземпляра. Разница в том, что методы экземпляра работают с экземпляром класса, в котором они определены, в отличие от статических методов.
Это означает, что методы экземпляра wheras могут обращаться к свойствам, полям и методам содержащего их класса через this
ключевое слово, например:
// Instance field
Form1 MainForm;
void InstanceMethod()
{
Form1 frm = this.MainForm;
}
Вы не можете сделать то же самое внутри статического метода (подумайте об этом, с каким экземпляром он будет работать?). Обратите внимание, что C # неявно предполагает использование this
ключевого слова в тех местах, где это имеет смысл (поэтому приведенный выше пример мог быть записан как Form1 frm = MainForm
).
Смотрите Статические методы C # для альтернативного объяснения статических методов vs instance (это важная концепция в объектно-ориентированном программировании, для правильного понимания которой вам следует потратить время).
В вашем примере вы, вероятно, хотите перейти DoActions
на метод экземпляра (удалив статическое объявление):
public void DoActions(string Cmd)
{
if(Cmd == true)
{
this.MainForm.Visible = false;
}
}
Это позволит ему получить доступ к MainForm
полю / свойству экземпляра, однако это может вызвать проблемы в других местах вашего кода в тех местах, где вы пытаетесь вызвать DoActions
из другого статического метода без предоставления экземпляра объекта.
Комментарии:
1. Привет, Краген, спасибо за объяснение. теперь я понял, почему у меня возникла эта проблема .. вы предлагаете мне изменить мои методы на нестатические?
2. @Katherina Вы можете либо изменить,
MainForm
чтобы быть статичным, либоDoActions
чтобы не быть статичным (или предоставить экземпляр при доступе,MainForm
напримерsomeForm.MainForm
). Что вам нужно сделать, будет зависеть от вашего приложения — в этом примере сложно определить, не зная более подробного контекста.3. Привет, Краген, спасибо за помощь, теперь я могу сказать, что рад, что решил свою проблему. Спасибо!
Ответ №2:
Установите непрозрачность формы и свойство showintaskbar в окне свойств:
this.Opacity = 0;
this.ShowInTaskbar = false;
Ответ №3:
Ваш метод статичен — и поэтому не может получить доступ к MainForm. Сделайте свой метод нестатическим, если это не обязательно.
public void DoActions(string Cmd)
{
если (Cmd == true)
{
MainForm.Visible = false;
}
}
Если это требуется, то создайте статическое поле в своем классе и убедитесь, что оно установлено перед запуском этого метода.