1

私は簡単なテストクラスを持っています:

public partial class TEST_CLASS
{
    public string IP { get; set; }
    public int PORT { get; set; }
}

iList<TEST_CLASS> MY_CLASS = new List<TEST_CLASS>();

そして、クラスを DGV にバインドする次のコードがあります。

        TEST_CLASS n = new TEST_CLASS();
        MY_CLASS.Add(n);


        grid_nodes.DataSource = MY_CLASS;

        Thread t = new Thread(set1);
        t.Start();

        Thread t2 = new Thread(set2);
        t2.Start();

そして、テスト目的でクラスをランダムな値に更新するスレッド:

    public void set1()
    {
        while (true)
        {
            Random r = new Random();
            MY_CLASS[0].IP = r.Next(999900);
            Thread.Sleep(100);
        }
    }

    public void set2()
    {
        while (true)
        {
            Random r = new Random();
            MY_CLASS[0].PORT = r.Next(999900);
            Thread.Sleep(100);
        }
    }

問題は、DGV が正しく更新されていないことです。セルをクリックするたびに更新が表示されるだけです。

何千もの行と個別のスレッドで MY_CLASS を更新する予定で、変更を DGV に「ライブ」で表示する必要があります。

私が理解している限り、クラスを更新するたびに DGV.Update() を呼び出す必要がありますか? 何千ものスレッドがクラスを絶えず更新するので、これを行う最善の方法は何でしょうか? ありがとう!

4

2 に答える 2

2

わかりましたので、タイマーに次のコードを追加し、いくつかの条件下でトリガーするようにしました。これはうまく機能します。

            grid.DataSource = null;
            grid.DataSource = MY_LIST;
            grid.Invalidate();
于 2012-04-17T14:56:48.677 に答える
0

List の代わりにBindingListを使用し、TEST_CLASS にINotifyPropertyChangedを実装すると、グリッドはそれ自体を更新します。ただし、何らかの形式のマーシャリング ( SynchronizationContextや grid. Invoke () など)によって UI スレッドでのみ発生するようにする必要があります。

于 2012-04-24T00:50:31.960 に答える