C # настройка формы.visible = false внутри метода?

#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;
}
}

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