2012-04-16 108 views
1

我有一个简单的测试类:绑定ILIST到DataGridView中,DGV没有更新

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()?这样做的最佳方式是什么,因为我将有数千个线程不断更新课程?谢谢!

+0

'成千上万的线程不断更新类'令人不安,你确定这个类是线程安全的吗? – 2012-04-16 13:35:03

+0

@JoshuaDrake不知道你的意思,我想可能不是。只是一个简单的类与变量在列表中。你能指出我可以在哪里了解更多信息吗?此外,我正在寻找的只是一个简单的代码示例,它可以完成我想要完成的任务,但我似乎无法找到任何东西。这是否真的是完成任务的“后方”?谢谢 – user1015551 2012-04-16 14:24:25

+1

关于[C#中的线程同步](http://www.albahari.com/threading/part2.aspx)和[线程安全集合](http://msdn.microsoft.com/en-us /library/dd997305.aspx)在C#中。 – 2012-04-16 14:39:01

回答

2

好了,我只是添加下面的代码在一个定时器,使其引发一些条件,伟大的工程下:

  grid.DataSource = null; 
      grid.DataSource = MY_LIST; 
      grid.Invalidate(); 
+1

如果不进行任何同步,您将获得跨线程异常。只有UI线程应该更新网格。确保你使用grid.Invoke()来做到这一点。 – 2012-04-17 15:33:46