2012-02-10 11 views
1

私はこれをしばらく働かせようとしてきましたが、(一般的にはC#とOOPにかなり新しいです)。子フォームからの親フォームの呼び出しメソッド

基本的に、私は2番目のフォーム上のコードのこの部分を持っている:

private void button1_Click(object sender, EventArgs e) 
{ 
    if (charCount > 2 && charCount < 30) 
    { 
     try 
     { 
      conn.Open(); 
     } 
     catch (Exception ex) 
     { 
     //Error handling code here 
     } 
     finally 
     { 
      conn.Close(); 
     } 
     //Run the SQL statements 
     try 
     { 

     //SQL insert data is here 

     } 
     catch (Exception ie) 
     { 
      MessageBox.Show(ie.Message); 
     } 
     finally 
     { 
      //Close the connection 
      if (conn.State != ConnectionState.Closed) 
      { 
       conn.Close(); 
      } 

      mainForm.refreshCall(); 

      this.Close(); 
     } 

    } 
    else 
    { 
     MessageBox.Show("Part numbers can be between 2 and 30 characters.\n Yours was " + charCount + " characters long.", "Error"); 
    } 

} 

これは、すべての(私がそのコードを取ったSQLデータベースにいくつかのデータを挿入している、それがになっているもの正常に動作していそれを少しきれいにする)。だからこそ、私はmainForm.refreshCall()を実行しようとします。このrefreshCall方法は、私の最初のフォーム、またはmainForm上に存在し、次のようになります。

public static void refreshCall() 
{ 
    SqlConnection conn = new SqlConnection("Data Source=DSERVER\\NEW_SQL;Initial Catalog=AWSoftware;Integrated Security=True"); 
    try 
    { 
     conn.Open(); 
     DataSet ds = new DataSet(); 
     SqlDataAdapter adapter = new SqlDataAdapter("SELECT part_num from dbo.CustomParts", conn); 
     adapter.Fill(ds); 
     this.listParts.DataSource = ds.Tables[0]; 
     this.listParts.DisplayMember = "part_num"; 
     conn.Close(); 
    } 

    catch (SqlException odbcEx) 
    { 
     MessageBox.Show("There was an error connecting to the data source\nError Code: 1001", "Database Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

しかし、this.listParts.DataSourcethis.listParts.DisplayMemberは、両方の彼らはエラー、静的メソッド、または静的フィールドの初期化に有効な静的プロパティではないことを教えてください。私はそれが意味することによって絶対に困惑しています。誰かが私のためにこれについていくつかの光を当てるほど親切であれば、私は非常にそれを感謝します!

答えて

0

refreshCallstaticとマークされていますが、インスタンス化された変数を参照しています(この場合はListBox)ので、動作しません。 ListBoxをパラメーター参照として渡すか、static属性を削除するだけです。

最も簡単な方法:

public void refreshCall() { 
    // blah-blah 
} 

その後、メソッド呼び出しの変更に:

this.refreshCall(); 
+0

私はthis.RefreshCall(への呼び出しを変更します)私はProgram.addPart「の定義が含まれていません」を取得'refreshCall'と拡張メソッドなし 'refreshCall' 'Program.addPart'タイプの最初の引数を受け入れることができました(usingディレクティブまたはアセンブリ参照がありませんか?) " –

+0

@AndrewDeForest' this.refreshCall() 'のみ'MainForm'フォームの中で動作します。なぜなら、' this'がrefeであるからですに向かう。あなたのプログラムの別のフォームがその呼び出しをしようとしているなら、あなたが使用しているMainFormへの参照を持っている必要があります。例えば、myFormです。この場合は、 'myForm.refreshCall()'になります。希望は意味をなさない。 – LarsTech

+0

はい、これは意味があります。実際は元々はやっていたものですが、「静的でないフィールド、メソッド、プロパティに対してオブジェクト参照が必要です」というメッセージが表示されます。 –

関連する問題