2010-12-08 13 views
2

私のコードに何か問題はありますか?私のコードで何が問題になっていますか? (C#Winforms)

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

私はこのエラーを得た:

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

+0

新しいForm()行は、新しいMyProgram()を実行したときにのみ実行されます。上記のコードを見ると、Form()の作成をmainメソッドに移動する必要があります。 – Gishu

+0

私はやったが、まだエラーがあります: '非静的フィールド、メソッドまたはプロパティ 'MyProgram.Form1_Closing(object、System.ComponentModel.CancelEventArgs)'のオブジェクト参照が必要です。 – yonan2236

答えて

6

(それはインスタンスメソッドですので、あなたのFormインスタンス変数は、あなたのメインクラスのForm1_Closing()コールバックにアクセスすることはできませんが、静的コンテキストにイベントハンドラを追加しているあなたMain()方法)。

あなたがいないMain()方法を通じて、MyProgramのインスタンスを使用して、そのイベントハンドラを追加するかがあります。

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(...) 
+0

そしてForm1自体はインスタンスフィールドです... – Cameron

+0

どうすればいいですか? – yonan2236

+0

変更フォームForm1 =新しいフォーム();静的なフォームForm1 =新しいフォーム(); – Jeff

0

基本的に、あなたは静的コンテキストで非静的プロパティを使用しようとしています。 Mainの静的コンテキストからFormClosingを呼び出すと、問題が発生します。

詳しくはMicrosoft's page for this errorをご覧ください。

+0

私の解決策になるはずですか? – yonan2236

+1

@ yonan2236 - @ SwDevMan81がうまくいくもの - メインメソッドの中にフォームform1 = new Form()を入れてください。 – JasCav

+0

はまだエラーが表示されています: 'Error Id:CS0120、Error:非スタティックフィールド、メソッド、またはプロパティ 'MyProgram.Form1_Closing(object、System.ComponentModel.CancelEventArgs)'、Line:10、Columnにオブジェクト参照が必要です:30 エラーID:CS0120、エラー:静的ではないフィールド、メソッド、またはプロパティにオブジェクト参照が必要です。 – yonan2236

1

Form Form1 = new Form()をメインに配置する必要があります。

0

エラーメッセージが指摘するように、Form1フィールドとForm1_Closing方法は、インスタンスMyProgramクラスのに、ないクラス自体に接続されています。 mainメソッドでインスタンスを作成し、また

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; 
-1

。主なものは、コンソールアプリケーションの内部にフォームを表示しようとしていて、失敗する可能性があるということです。ユーザーインターフェイスを使用するには、Windowsメッセージを処理するユーザーインターフェイススレッドが必要です。 Visual Studioテンプレートを使用して、新しい空のWinFormsアプリケーションを作成して、表示される開始フォームを作成する方法を示すことをお勧めします。

0

静的関数からメンバ変数にアクセスしようとしているため、メンバ変数自体が静的である必要があると思います。

関連する問題