2017-01-16 15 views
0

DataGridViewを入力しようとしています。私は静的クラスあるFileSystemWatcherハンドラでそれをやっているので、しかし、それは私にエラーを与える:静的メソッドでDataGridViewを設定する方法は?

An object reference is required for non-static field, method, or property 

私はEventHandlerその後、非静的にクラスを変更した場合、同じエラーになります。私は現在ループにあり、解決策を見つけることができませんでした。この問題を解決するために私を助けてください。ここで

class FCheck 
    { 
     public static void tpCard_Created(object sender, FileSystemEventArgs e) 
     { 
      Console.WriteLine("ThreadId:" + Thread.CurrentThread.ManagedThreadId + " " + "File:" + e.FullPath); 

      if (Path.GetExtension(e.FullPath) == ".f") 
      { 
// Do something.... 

       Form1.populateTable(tp); 
      } 

     } 
    } 

はメインのForm1です:

 public void checkTPFiles() 
     { 
      FileSystemWatcher fw = new FileSystemWatcher(@"F:\tmp"); 
      fw.Created += LSCheck.tpCard_Created; 
      fw.EnableRaisingEvents = true;           
     } 

     public static void populateTable(TpCard tpCard) 
     { 
      DataGridViewRow row = (DataGridViewRow)dataGridView1.Rows[0].Clone(); 
      row.Cells[1].Value = tpCard.FNumber; 
      dataGridView1.Rows.Add(row); 
     } 
+0

フォームのコントロールに書き込むには、フォームクラスのインスタンスを使用する必要があります。フォームは1つしかありませんが、私の2つのフォームプロジェクトを見れば助けになるかもしれません。 FCheckクラスは2番目のフォームに相当します。 http://stackoverflow.com/questions/34975508/reach-control-from-another-page-asp-net – jdweng

+0

@jdwengもっと私を助けてくれますか?私はより良い理解のためにスニペットを書くことができますか? – goGud

+0

私はrboeのようなソリューションを推薦します。しかし、私はあなたに良い答えを与えるためにプロジェクトの構造を見る必要があります。私はあなたの投稿されたコードからあなたのクラスの関係を知らない。フォームプロジェクトやコンソールプロジェクト、クラスのインスタンスがあるかどうかはわかりません。 – jdweng

答えて

0

一つの簡単な解決策は、あなたのFCheckクラスにForm1インスタンスを渡すことです。クラスはしっかりが接続されているので、これは、すべての最高の解決策ではありません

class FCheck 
{ 
    private readonly Form1 _form; 

    public FCheck(Form1 form) 
    { 
     _form = form; // <= remember Form1 instance for future use 
    } 

    public void tpCard_Created(object sender, FileSystemEventArgs e) 
    { 
     Console.WriteLine("ThreadId:" + Thread.CurrentThread.ManagedThreadId + " " + "File:" + e.FullPath); 

     if (Path.GetExtension(e.FullPath) == ".f") 
     {     
      // Do something.... 

      _form.populateTable(tp); // <= now it is possible to call instance methods 
     } 

    } 
} 

:あなたのクラスで

public void checkTPFiles() 
    { 
     FileSystemWatcher fw = new FileSystemWatcher(@"F:\tmp"); 

     var fCheck = new FCheck(this);  // <= passes Form1 instance 
     fw.Created += fCheck.tpCard_Created; // <= no static call anymore 
     fw.EnableRaisingEvents = true; 
    } 

    public void populateTable(TpCard tpCard) 
    { 

    } 

はFCheck:あなたのをForm1

FCheckがイベントを発生させ、Form1がそれに反応するようにイベントと代理人を使用すると、より良いアプローチになります。上記のソリューションは、あなたを動かすための第一歩です。

+0

この解決策はstaitcの問題を解決しました。しかし、スレッドの問題については例外が発生しています。 「追加情報:クロススレッド操作が無効です:作成されたスレッド以外のスレッドからアクセスする 'dataGridView1を制御してください」 – goGud

+0

@スレッドを管理してから、私は問題を解決しました。 – goGud

関連する問題