0

私のプログラムでは、複数のインスタンスが存在する可能性のある別のプログラムを自動化しようとしています。プロセスリストを監視し、自動化したいプログラムのすべてのプロセスを検出する機能を既に作成しました。

見つかったインスタンスに関するいくつかの基本情報をこの ConcurrentDictionary に格納します。この ConcurrentDictionary は、その ProcessId をキーとして、クラス ProgramToWatch を値として持ちます。

public static ConcurrentDictionary<int, ProgramToWatch> ProgramToWatchDictionary = new ConcurrentDictionary<int, ProgramToWatch>();

public class ProgramToWatch
{
    public string ListItemName { get; set; }
    public Process BEProcess { get; set; }
    public string BEMainWindowTitle { get; set; }
    public Application BEApplication { get; set; }
    public Window BEWindow { get; set; }
    public bool isLoggedIn { get; set; }

    public List<ProgramToWatchDataGrid> BEDataGrid = new List<ProgramToWatchDataGrid>();
}

今、私が問題を抱えている部分。見たいプログラムには、辞書にコピーしたい DataGridView があります。このために、BEDataGrid リストがあります。リストは、このクラスをそのタイプとして使用しています:

public class ProgramToWatchDataGrid
{
    public int ListID { get; set; }
    public string Name { get; set; }
    public string Mail { get; set; }
}

これを格納するために、ProgramToWatchDataGrid の別のインスタンス (updateGrid と呼ばれます) を作成し、読み取ったすべてのデータをそのインスタンスに書き込み、これを辞書に配置します (単純化しました)。これを行うには、DataGrid を反復処理し (最初の while ループ)、行ごとに行を繰り返し、updateGrid を Dictionary にコピーします。2 番目の while ループでは、確認する値を表示します。

public void ReadDataGridView(int ProcessId)
{
    ProgramToWatchDataGrid updateGrid = new ProgramToWatchDataGrid();

    //read and store every row
    int i=0;
    while(i<=totalRowsInGrid)
    {
        updateGrid.ListId = DataGrid.Rows[i].Cells[0].Value;
        updateGrid.Name = DataGrid.Rows[i].Cells[1].Value;
        updateGrid.Mail = DataGrid.Rows[i].Cells[2].Value;
        ProgramToWatchDictionary[ProcessID].BEDataGrid.Insert(i, updateGrid);
        Display(ProgramToWatchDictionary[ProcessID].BEDataGrid[i].Mail);
    }

    Display("Elements: " + ProgramToWatchDictionary[ProcessID].BeDataGrid.Count);

    //display every rows mail
    i=0;
    while(i<=totalRowsInGrid)
    {
        Display("HI: " + ProgramToWatchDictionary[ProcessID].BEDataGrid[i].Mail);
        i++;
    }
}

私が理解している方法では、情報をその場所に挿入したため、読み取った情報行は ProgramToWatchDictionary[ProcessID].BEDataGrid[accordingRow] に配置されるはずです。

奇妙なことに、次の出力が生成されます。

[01:19] christoferlindstrm@yahoo.com
[01:19] eliseisaksson@yahoo.com
[01:19] peter@pan.com
[01:19] Elements: 3
[01:19] HI: peter@pan.com
[01:19] HI: peter@pan.com
[01:19] HI: peter@pan.com

したがって、挿入した直後に、リストには正しい値が含まれています。しかし、それは常に最後に読み取られた値になるのでしょうか? これはなぜ起こり、どうすれば修正できますか?

いくつかの助けをいただければ幸いです。

4

1 に答える 1