开发者

What is wrong with my code? (C# Winforms)

Is there anything wrong in my code?

using System;
using System.Windows.Forms;

    public class MyProgram 
    { 
        Form Form1 = n开发者_如何学运维ew 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;
        }
    }

I got this error:

Error Id: CS0120, Error: An object reference is required for the non-static field, method, or property 'MyProgram.Form1_Closing(object, System.ComponentModel.CancelEventArgs)', Line: 10, Column: 30 Error Id: CS0120, Error: An object reference is required for the non-static field, method, or property


Your Form instance variable cannot access your main class's Form1_Closing() callback because it's an instance method, but you're adding the event handler in a static context (your Main() method).

You have to either add that event handler using an instance of MyProgram, not through the Main() method:

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

Or declare your Form field a static field, and your Form1_Closing() event handler a static method so Main() can use them:

static Form Form1 = new Form();

private static void Form1_Closing(...)


You need to put Form Form1 = new Form () in main.


Basically, you are trying to use a non-static property in a static context. Calling FormClosing from the static context of Main is what's giving you the problem.

Read more about it at Microsoft's page for this error.


I'd assume that because you're attempting to access a member variable from a static function, the member variable itself needs to be static.


As the error message points out, the Form1 field and the Form1_Closing method are tied to instances of the MyProgram class, not to the class itself. You could make them static to fix the problem:

 static Form Form1 = new Form();

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

Alternatively, create an instance in the main method:

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

Of course, there's no need for any of this since you don't appear to use the field anywhere else - you could just make it a local variable instead.

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

You could also choose to write the trivial event-handler method as a lambda instead:

form.FormClosing += (sender, e) => e.Cancel = true;


You have several problems here. The main one is that you are trying to show a Form inside a console application and that is bound to fail. To have a user interface you need a user interface thread that is processing windows messages. I recommend that you use the Visual Studio templates to create a new blank WinForms application that will show you the way to create a starting Form that shows.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜