2012-04-23 5 views
0

私は、メインフォームの選択方法としてリストボックスを使用するC#でプログラムを作成しています。リストボックス内の項目を編集できる機能があります。 他のフォームからの関数へのアクセス

は、私は別々の専用フォームから項目を編集したかったので、私は、フォームの新しいインスタンスを作ったが、私は(私が公開されている)、元のフォームの機能にアクセスしようとするたびに、私はこのエラーを取得: エラー2非静的なフィールド、メソッド、またはプロパティにオブジェクト参照が必要です

私はインターネットをかなり見渡しましたが、私の見るところには私の機能に静的なプロパティを使用している人がいます。しかし、私はこれを行うとき、私は、関数内の変数などの上に

をポップアップ上記のエラーの多くを得るここで(私が参照しようとしている)をForm1内の関数

public void ReadConfig(string configFile) 
    { 
     fileList.Clear(); 
     listBoxName.Items.Clear(); 
     FileStream file = null; 

     if (!File.Exists(file)) 
     { 
      MessageBox.Show(file + " was not found: Creating blank file"); 
      using (file = File.Create(file)) ; 
     } 
     else 
     { 
      string line; 
      int lineNumber = 1; 

      // I cut out some long code here where the program reads from a file and saves it to an object 
     } 
    } 

はここだですエラーが行われる場所のためのコードスニペットは、(私は、テキストファイルに保存し、いくつかのコードをカットしますが、懸念の主な部分は、私はそれが十分願っていますForm1.ReadFile(Form1.file)

 private void buttonSave_Click(object sender, EventArgs e) 
    { 
     string[] temp = File.ReadAllLines(Form1.file); 
     string[] newFile; 

     if (itemNew == true) 
     { 
      newFile = new string[temp.Length + 1]; 
     } 
     else 
     { 
      newFile = new string[temp.Length]; 
     } 

     for (int i = 0; i < temp.Length; i++) 
     { 
      newFile[i] = temp[i]; 
     } 
     File.WriteAllLines(Form1.file, newFile); 
     ConfigForm.ReadFile(Form1.file); 


     this.Close(); 
    } 

です私のプログラムはかなり長いので、私はそれを短く、pオッシブル。私に忍耐してくれてありがとう=]

私はプログラムでとても新しいので、どんな種類の魂が起こったら可能な限りシンプルに保つことができますか?

おかげでずっと=]

+0

? – JohnFx

+0

C#。申し訳ありません、忘れました=] –

+1

エラーが発生したコードを表示します。私たちはインターネットであなたの画面を読むことができません。 – JohnFx

答えて

1

これはおそらく、静的であるかのように2番目のウィンドウの最初のウィンドウに存在する関数を使用しようとしているためです。

あなたはこの問題を解決するためにこの方法を試すことができます。

フォームのように、あなたの最初のフォームのクラスとプロパティを作成中
  • :次に

    class Form1 : Form 
    { 
        //this property will store reference to the first form 
        public Form1 AssociatedFirstForm { get; set; } 
        //... 
    } 
    
  • で2番目のフォームを作成するコードでは、このプロパティに最初のフォームを割り当てます(最初のフォームから2番目のフォームを作成する場合)。

    ... 
    Form2 secondForm = new Form2(); 
    secondForm.AssociatedFirstForm = this; 
    ... 
    

またはこのような(あなたは、コードの別の部分から両方のフォームを作成する場合):

... 
    Form1 firstForm = new Form1(); 
    Form2 secondForm = new Form2(); 
    secondForm.AssociatedFirstForm = firstForm; 
    ... 
  • そして、あなたの形式で呼び出すことができるはずですこのような最初の形式からの方法:

    ... 
    var myResultFromAnotherWindow = this.AssociatedFirstForm.SampleMethodToCall(); 
    ... 
    

static classes and class memberscreating instances of objectsを使用する方法についてさらにお読みください。いつどのように使用するのかを明確にする必要があります。

更新

私は十分にそれを明確に書かれていませんが、それが本当に必要でないなら、あなたはpublicとしてメソッドやプロパティを公開設定することは避けるべきです。

アプリケーションで適切なコード構造を作成し、それを行う方法を学習するには、オブジェクト指向プログラミングに関する記事をご覧ください。

いくつかのサンプルリンク:

イベンティングメカニズムを知ることにも役立ちます:http://msdn.microsoft.com/en-us/library/awbftdfh.aspx

+0

これは初心者のためのものだが、メインフォームにすべてのメソッドを公開する "私は今まで見たことがある場合は、アンチパターンです。より良い解決策は、何かが発生したことを親フォームに通知するためにイベントを使用し、応答で必要に応じて状態を更新できるようにすることです。現在書かれているように、私はこれをアップヴォートにすることはできません。 –

+0

私はこれを試しましたが、今は違うエラーが発生しています。今回は、 エラー "Resources"パラメータで項目が複数回指定されました。重複した項目は、「リソース」パラメータでサポートされていません。 \t 関連するクラスを真上に、ちょうど上に置く パブリック部分クラスForm2:フォーム これは適切な場所であるかどうかはわかりませんが、元のエラーを取り除いています。助けてくれてありがとう=] –

+0

@Ed S .:すでに述べたように、オブジェクト指向プログラミングのコンセプトに反するため、すべてのメソッドを公開するようには言いません。しかし、メソッド(またはプロパティ)がフォームの特別なものであれば、それを公開として公開することができます。つまり、別のフォーム(つまり親フォーム)が(OpenFileDialogフォームから 'FileName'を読み込むように)使用できます。たぶん私は答えの中で公衆を暴露することを虐待しないように書いていたはずです。 –

0

あなたはタイプのインスタンスでないタイプのメソッドを呼び出しています。メソッドがstaticとして宣言されていない場合は、それらのメソッドを含むオブジェクトを最初にインスタンス化する必要があります(newを使用)。

0

ここでは、達成しようとしていることの基本的な考え方があります。これを行うより高度な方法は、デリゲート/イベントハンドラを使用することですが、今のところそれを簡単に保つことが必要でした。どのようなプログラミング言語

フォーム1

public Form1() 
    { 
     InitializeComponent(); 
    } 

    List<string> _items = new List<string>(); 

    public void LoadListBoxWithItems() 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      _items.Add(string.Format("My New Item {0}", i)); 
     } 
     lbItems.DataSource = _items; 
     lbItems.Refresh(); 
    } 

    private void btnUpdate_Click(object sender, EventArgs e) 
    { 
      Form2 form2 = new Form2(); 
      form2.LoadValues(lbItems.SelectedItem.ToString(), this); 
      form2.ShowDialog(); 
    } 

    public string GetCurrentItem() 
    { 
     return lbItems.SelectedItem.ToString(); 
    } 

    public void UpdateItem(string item, string newitem) 
    { 
     int index = _items.IndexOf(item); 
     _items[index] = newitem; 
     lbItems.Refresh(); 
    } 

フォーム2

public Form2() 
    { 
     InitializeComponent(); 
    } 

    private string _originalvalue = null; 
    private Form1 _form1; 

    public void LoadValues(string item, Form1 form) 
    { 
     _originalvalue = item; 
     _form1 = form; 
    } 


    private void btnSave_Click(object sender, EventArgs e) 
    { 
     // Do work to change value 
     string newvalue = _originalvalue; 
     _form1.UpdateItem(newvalue, _originalvalue); 
    } 
+0

xmlがサンプルコードにコメントするのはなぜですか?特に彼らは終わっていない。 –

+0

@Periそれは習慣です。私のコードの大半は他の人によって消費され、私は私が従う一定の流れを持っています。 1.書き込みメソッド - 私はそれが完了したと思う - 私はXMLのコメントセクションを追加し、崩壊。 2.コード/リファクタ/などに対するすべてのテストを記述します。すべてのテストが合格すると、チェックインする前に必要なコメント/コメントを書き戻します。 – tsells

関連する問題