Что не так с моим кодом? (C # Winforms) - PullRequest
2 голосов
/ 08 декабря 2010

Что-то не так в моем коде?

using System;
using System.Windows.Forms;

    public class MyProgram 
    { 
        Form Form1 = new Form();

        public static void Main(string[] args) 
        {      
            Form1.FormClosing += new System.Windows.Forms.FormClosingEventHandler(Form1_Closing);
            Form1 .Show();        
        } 

        private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
             e.Cancel = true;
        }
    }

Я получил эту ошибку:

Идентификатор ошибки: CS0120, ошибка: объект ссылка необходима для нестатическое поле, метод или свойство «MyProgram.Form1_Closing (объект, System.ComponentModel.CancelEventArgs)», Строка: 10, столбец: 30 Код ошибки: CS0120, Ошибка: ссылка на объект обязательна для нестатического поля, метода или недвижимость

Ответы [ 6 ]

6 голосов
/ 08 декабря 2010

Ваша переменная Form экземпляра не может получить доступ к обратному вызову Form1_Closing() вашего основного класса, потому что это метод экземпляра, но вы добавляете обработчик событий в статическом контексте (ваш Main() метод).Вы должны либо добавить этот обработчик события, используя экземпляр MyProgram, а не метод Main():

MyProgram main = new MyProgram();
main.Form1.FormClosing += new FormClosingEventHandler(main.Form1_Closing);
main.Form1.Show();

, либо объявить ваше поле Form статическим полем, а событие Form1_Closing()обработчик статический метод, поэтому Main() может использовать их:

static Form Form1 = new Form();

private static void Form1_Closing(...)
1 голос
/ 08 декабря 2010

Вам нужно поставить Form Form1 = new Form () на главную.

0 голосов
/ 08 декабря 2010

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

0 голосов
/ 08 декабря 2010

У вас есть несколько проблем здесь.Основным является то, что вы пытаетесь показать форму внутри консольного приложения, и это обязательно приведет к сбою.Чтобы иметь пользовательский интерфейс, вам нужен поток пользовательского интерфейса, который обрабатывает сообщения Windows.Я рекомендую использовать шаблоны Visual Studio для создания нового пустого приложения WinForms, которое покажет вам способ создания начальной формы, которая показывает.

0 голосов
/ 08 декабря 2010

Как указывает сообщение об ошибке, поле Form1 и метод Form1_Closing привязаны к экземплярам класса MyProgram, а не к самому классу . Вы можете сделать их статическими, чтобы решить проблему:

 static Form Form1 = new Form();

 static void Form1_Closing(object sender, CancelEventArgs e) { ... }

Либо создайте экземпляр в основном методе:

// really bad code; only a demonstration
var myProgram = new MyProgram();
myProgram.Form1.FormClosing += myProgram.Form1_Closing;
myProgram.Form1.Show();       

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

var form = new Form();
form.FormClosing += Form1_Closing; // make Form1_Closing a static method
form.Show();

Вы можете также написать тривиальный метод-обработчик событий как лямбду:

form.FormClosing += (sender, e) => e.Cancel = true;
0 голосов
/ 08 декабря 2010

По сути, вы пытаетесь использовать нестатическое свойство в статическом контексте. Вызов FormClosing из статического контекста Main - это то, что создает вам проблему.

Подробнее об этом можно прочитать на странице Microsoft об этой ошибке .

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