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.
精彩评论