2016-04-02 13 views
0

Windowsフォームのソースコード内にヘルパー関数を作成しましたが、正しいフォームのソースコード内の別の場所で変数を参照するにはどうしたらいいですか?同じWindowsフォームの関数間の参照変数

次の例では、myVarはmyFormで宣言され、myTextBoxはデザイナーで描画されます。どちらもエラーとして「非スタティックフィールド、メソッド、またはプロパティ」にオブジェクト参照が必要です。

静的なmyVarを定義するとコードは機能しますが、その値を変更するとどうなりますか?テキストボックスについては、デザイナーファイルで静的に変更してもエラーは修正されません。

(私は他の質問を見ましたが、そこに提案された解決法は私のコードに適合しないようです)。あなたはクラスのインスタンスを渡すことなく、静的メソッドでインスタンス変数をrefernceすることはできません

myForm.cs

namespace myThing 
{ 
    public partial class myForm : Form 
    { 
     public int myVar; 

     public myForm() 
     { 
      InitializeComponent(); 

      myVar = 0; 

     } 

     static void foo(Point checkPoint, List<Vertex> checkList) 
     { 
      int myNumber = myForm.myVar; 

      myForm.myTextBox.Text = ""; 
      //OR 
      System.Windows.Forms.TextBox.myTextBox.Text = ""; 
     } 

my.Form.Designer.cs

namespace myThing 
{ 
    partial class myForm 
    { 
     //a bunch of stuff goes here 

     private System.Windows.Forms.PictureBox myPictureBox; 
     private System.Windows.Forms.TextBox myTextBox; 
    } 
} 
+1

staticの代わりにpublicを試しましたか? – jdweng

+0

は現在両方で試用されていますが、動作しません。 – maja

+1

ヘルパーメソッド/関数はstatic宣言されています。静的メソッドは、myVarとしてインスタンス変数にアクセスすることはできません。静的キーワードをfooから削除すればうまくいくはずです。 – Markus

答えて

1

変数はで定義されます。

可変宣言を静的にするか(おそらくあなたがしたくないもの)、またはfoo()関数を非静的にするか、変数が存在するフォームのインスタンスをfoo()メソッドに渡します。

フォームは概念的なエラーを作り出しているようです。つまり、フォームはそのような視覚的な構造ではなく、ただのクラス宣言です。必要に応じて、いつでも同じフォームのインスタンスをメモリ内にいくつでも持つことができます。他のクラス宣言とまったく同じように動作します。あなたがMS Accessやそれに類するものから来ているなら、これは奇妙に思えるかもしれません。

たとえば、静的なFoo()内のmyForm変数には値がありません。つまり、クラスmyFormの特定のインスタンスを示していないため、クラスの静的プロパティを参照するためにのみ使用されている場合を除きます。

+0

で、myFormは "this"と同じではありませんか? – maja

+0

あなたはパラメータを渡すときと同じように、フォームのインスタンスをfooに渡すことを意味しますか?私は(それは動作しません)ないと思います。 – maja

+1

いいえ - myFormはクラス名です。 "this"は、TypeがmyFormのクラスのインスタンスへのポインタです。 – PhillipH

0

この問題の解決策は、fooメソッドをpublicに設定することでした。

関連する問題