デリゲートを使用して、別のクラスとスレッドで計算されたデータで datagridview を更新しようとしています。残念ながら、試したアプローチによっては、さまざまなエラーで問題が発生しています。
フォーム スレッドで実行しようとしているコードは次のようになります。
public partial class AcquireForm : Form
//
// ...
//
// update the grid with results
public delegate void delUpdateResultsGrid(int Index, Dictionary<string, double> scoreCard);
public void UpdateResultsGrid(int Index, Dictionary<string, double> scoreCard)
{
if (!this.InvokeRequired)
{
//
// Some code to sort the data from scoreCard goes here
//
DataGridViewRow myRow = dataGridViewResults.Rows[Index];
DataGridViewCell myCell = myRow.Cells[1];
myCell.Value = 1; // placeholder - the updated value goes here
}
}
else
{
this.BeginInvoke(new delUpdateResultsGrid(UpdateResultsGrid), new object[] { Index, scoreCard});
}
}
ここで、このメソッドを別のスレッドとクラスから実行する必要があります。私が試してみました:
public class myOtherClass
//
// ...
//
private void myOtherClassMethod(int myIndex)
{
// ...
AcquireForm.delUpdateResultsGrid updatedelegate = new AcquireForm.delUpdateResultsGrid(AcquireForm.UpdateResultsGrid);
updatedelegate(myIndex, myScoreCard);
}
残念ながら、これにより「非静的フィールド、メソッド、またはプロパティ AcquireForm.UpdateResultsGrid(int, System.Collections.Generic.Dictionary) にはオブジェクト参照が必要です」というエラーが発生します。UpdateResultsGrid メソッドがまったく参照できないようです...
私はそれに気づいた
public class myOtherClass
//
// ...
//
private void myOtherClassMethod(int myIndex)
{
// ...
AcquireForm acquireForm = new AcquireForm();
acquireForm.UpdateResultsGrid(myIndex,myScoreCard);
}
コンパイル時にエラーはスローされませんが、新しいフォームを作成しようとします。これは私がやりたくないことです。AcquireForm の新しいインスタンスを作成したくありません。可能であれば、既存のインスタンスを参照したいと考えています。
UpdateResultsGrid メソッドを静的にすることも試みましたが、これにより、「this.(anything)」の使用を含むいくつかの問題が発生します。
また、UpdateResultsGrid メソッドの大部分を myOtherClassMethod に移動しようとしましたが、AcquireForm クラスにはデリゲートだけを残しました。繰り返しますが、UI オブジェクトへの参照の多くが壊れているため、これは機能しません (スコープ内に dataGridViews がありません)。
ここでアイデアが不足し始めています。残念ながら、私は C# にかなり慣れていないため (おそらくおわかりのように)、自分で完全にゼロからコードを作成するのではなく、他の人のコードを編集しています。誰かがこの問題についてアドバイスを提供できれば、それは非常にありがたいです。