0

I am explaining my problem elaborately. I have a dataGridView in Windows main form. I have a timer which is starting when button1 is clicked. and it stops when button2 is clicked.

Now in the meantime I am calculating something and putting it in the dataGridView. This is a dynamic calculation. In this calculation I am using a Thread. (I am absolutely new in Threads) . I have used Thread.Sleep(100) to calculate data. Now I am using a Thread.Sleep in a loop where I am calculating data of consecutive things. I want the respective order of the calculation to remain. After each iteration of the loop I am using dataGridView.Rows.AddRange(DataGridViewRow) to add new row with new data calculated.

But I am not getting the data in the dataGridView in the order and also it's not coming properly. It's getting blanked out sometime and coming randomly.

P.S - I am clearing the data each time when the timer interval is over.

4

4 に答える 4

0

UI スレッドからのみ UI コントロールにアクセスできます。

他のスレッドからそれらにアクセスしようとすると、発見したように未定義の動作が発生します。

この無料の電子ブックを読むことから始めることをお勧めします: Albahari

于 2012-11-27T12:32:19.370 に答える
0

解決済みです。実際には、インターバルThread.Sleepが終了する前にタイマーが完了するようにタイマーを設定する必要があります。Windows.Forms.Timer

于 2012-11-28T06:27:08.180 に答える
0

datagridview を更新する前に、datagridview.InvokeRequired を呼び出す必要があります。これが true の場合は、実行したいデリゲートと渡したいデータを渡して Invoke を呼び出します。

于 2012-11-27T13:52:35.280 に答える
0

Gridview を設定するスレッド セーフな方法を次に示します。

class Program
{
public static List<string> ChoiceExtension = new List<string>();
static void Main()
{
    ChoiceExtension.Add("One");
    ChoiceExtension.Add("Two");
    ChoiceExtension.Add("Three");
    //Set list as gridsource
    InserttoGrid(ChoiceExtension);

}

public static void SetDataSource(object value)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Path of Extension");
        foreach (var item in value as List<string>)
        {
            dt.Rows.Add(new object[] { item });

        }
        ExtensionList.DataSource = dt;
    }
public static void InserttoGrid(List<string> List)
    {
        if (ChoiceExtension.Count >0)
        {

            if (this.ExtensionList.InvokeRequired)
            {
               ExtensionList.Invoke(new SetDataSourceDelegate(SetDataSource), new Object[] { List });


            }
            else
            {
                SetDataSource(List);

            }

        }
    }

}
于 2017-05-15T08:20:00.947 に答える