private void Form2_Load(object sender, EventArgs e)
            dataGridView2.DataSource = dtRate;
            new Thread(new ThreadStart(this.addData)).Start();
        }
void addData()
        {
            for (int i = 0; i < 1000; i++)
            {
                DataRow drRate = dtRate.NewRow();
                drRate[0] = "A" + i.ToString();
                drRate[1] = "B" + i.ToString();
                drRate[2] = "C" + i.ToString();
                drRate[3] = "D" + i.ToString();
                dtRate.Rows.Add(drRate);
                Thread.Sleep(100);
            }
        }
   我想实现当DataTable的数据变化的时候DataGridView中的数据时时的变化,
我用Timer加一个DataGridView2.Refresh()是可以实现的,但是DataGridView2能看出来在闪动,而且
我的DataTable的变化频率是很快的,如果用Timer还是时间上有间隔误差的,DataGridView不能完全精确的反应出DataTable
的变化情况。
    请高人支招,请公布最好是测试通过的方法。

解决方案 »

  1.   

    数据源绑定后 本来就可以做到数据源更新自动映射到datagridviewlz还是说一下应用场景吧
      

  2.   

    在你的线程中使用DataGridView2.Refresh()试试
      

  3.   

    应用场景:
    我是丛一个Socket取数据,
    取数据用的是异步Socket,丛Socket源里面取出来的数据(不停的取,永远也不停),我想在DataGridView中时时显示,但是显示不出来,
    但是如果我点击DataGridView的排序或者什么,那样就会显示出来。但是不变化。
    我认为是线程的问题,
    所以我加了一个timer,来时时的刷新DataGridView(DataGridView.reFresh())
    但是又出现一个问题,DataGridView总是闪啊闪,而且Timer是有间隔的,
    间隔太小,很准确,但是导致CPU升高,间隔太大,数据不准确。
    请高人支招。
      

  4.   

    这是我的测试代码 timer频率是100毫秒 数据更新正常 datagridview时时更新正常private void timer1_Tick(object sender, EventArgs e)
    {
     ds.Tables[0].Rows[0][1] = DateTime.Now.Millisecond.ToString();        
             
    }/
      

  5.   

    如果你每次都是刷整个DataGridView的话,当然闪呀,你可以具体刷一行呀。也就是说,每次只刷你要更新的行,不更新的不刷,具体方法就像楼上写的那样。
      

  6.   

    你所谓的"闪动"是没有任何办法的.那是数据变化引起的视觉反应.
    至于监控DataTable的变化,你可以用事件来监控,这样就能做到一有变法马上就能通知事件处理程序的目的
      

  7.   

    末日之痕
    请贴出全部代码,
    你更新数据是在Timer线程,
    能否测试一个用
    new   Thread(new   ThreadStart(this.addData)).Start(); 
    这样的线程。
      

  8.   

    定义一个类,然后把更新DataTable的代码放到这个类中,并且在类中添加监控数据编码的事件就可以了
      

  9.   

    如果是通过数据源绑定的,数据源发生变化后,GridView本身也会变化
    二一种就是时时的人为绑定刷新~~
      

  10.   

    我是用如下方法添加和更新数据的,
    我怀疑可能更这个有关。              DataRow dr = dtsymbol.NewRow();
                dr[0] = quote.Symbol.ToString();
                dr[1] = quote.Bid.ToString();
                dr[2] = quote.Ask.ToString();
                dr[3] = quote.FeedID.ToString();            dtsymbol.BeginLoadData();
                dtsymbol.LoadDataRow(dr.ItemArray, LoadOption.OverwriteChanges);
                dtsymbol.EndLoadData();
      

  11.   

    用线程监控,DataTable有更新时,将更新的内容更新到GridView中,实现局部更新
      

  12.   

    有新情况。奇怪的问题,
             private void Form2_Load(object sender, EventArgs e)
            {
                dataGridView2.DataSource = dtRate;
            }        private void button1_Click(object sender, EventArgs e)
            {
                new Thread(new ThreadStart(this.addData)).Start();
            }       void addData()
            {
                for (int i = 0; i < 10; i++)
                {
                    DataRow drRate = dtRate.NewRow();
                    drRate[0] = "A" + i.ToString();
                    drRate[1] = "B" + i.ToString();
                    drRate[2] = "C" + i.ToString();
                    drRate[3] = "D" + i.ToString();
                    dtRate.Rows.Add(drRate);
                }
            }
    如果我把new Thread(new ThreadStart(this.addData)).Start();写到Form_load里面就没问题,
    但是如果我放到一个button的Click事件里面就不行了。
    请指教。
      

  13.   


    //定义一个监控数据变化的委托
        public delegate void DataHasChanged(DataTable dt);
        //定义一个数据监控类
        public class MonitoringDataChangement
        {
            private DataTable dt;
            public DataTable DT
            {
                set
                { 
                    //判断value是否与dt中的数据相同
                    //如果不相同则调用事件
                    dt = value;
                    DataChanging(dt);
                }
                get
                { 
                    //.........
                    return dt;
                }
            }
            //数据监控的事件
            public event DataHasChanged DataChanging;
        }
      

  14.   

    谁能调通如下代码,为什么不更新。
      private   void   Form2_Load(object   sender,   EventArgs   e) 
                    { 
                            dataGridView2.DataSource   =   dtRate; 
                    }                 private   void   button1_Click(object   sender,   EventArgs   e) 
                    { 
                            new   Thread(new   ThreadStart(this.addData)).Start(); 
                    }               void   addData() 
                    { 
                            for   (int   i   =   0;   i   <   10;   i++) 
                            { 
                                    DataRow   drRate   =   dtRate.NewRow(); 
                                    drRate[0]   =   "A"   +   i.ToString(); 
                                    drRate[1]   =   "B"   +   i.ToString(); 
                                    drRate[2]   =   "C"   +   i.ToString(); 
                                    drRate[3]   =   "D"   +   i.ToString(); 
                                    dtRate.Rows.Add(drRate); 
                            } 
                    } 
      

  15.   

    谁能调通如下代码,为什么不更新。
      private   void   Form2_Load(object   sender,   EventArgs   e) 
                    { 
                            dataGridView2.DataSource   =   dtRate; 
                    }                 private   void   button1_Click(object   sender,   EventArgs   e) 
                    { 
                            new   Thread(new   ThreadStart(this.addData)).Start(); 
                    }               void   addData() 
                    { 
                            for   (int   i   =   0;   i   <   10;   i++) 
                            { 
                                    DataRow   drRate   =   dtRate.NewRow(); 
                                    drRate[0]   =   "A"   +   i.ToString(); 
                                    drRate[1]   =   "B"   +   i.ToString(); 
                                    drRate[2]   =   "C"   +   i.ToString(); 
                                    drRate[3]   =   "D"   +   i.ToString(); 
                                    dtRate.Rows.Add(drRate); 
                            } 
                    } 
    为什么只有我点击DataGridView的排序,或者是拖动一下DataGridView的列宽,数据才显示出来,
    但是如果我把开启线程的语句写到Form_load里面就可以显示,为什么写到Button_Click事件
    里面就不显示那。
      

  16.   

    谁能调通如下代码,为什么不更新。 
        private       void       Form2_Load(object       sender,       EventArgs       e)   
                                    {   
                                                    dataGridView2.DataSource       =       dtRate;   
                                    }                                   private       void       button1_Click(object       sender,       EventArgs       e)   
                                    {   
                                                    new       Thread(new       ThreadStart(this.addData)).Start();   
                                    }                               void       addData()   
                                    {   
                                                    for       (int       i       =       0;       i       <       10;       i++)   
                                                    {   
                                                                    DataRow       drRate       =       dtRate.NewRow();   
                                                                    drRate[0]       =       "A"       +       i.ToString();   
                                                                    drRate[1]       =       "B"       +       i.ToString();   
                                                                    drRate[2]       =       "C"       +       i.ToString();   
                                                                    drRate[3]       =       "D"       +       i.ToString();   
                                                                    dtRate.Rows.Add(drRate);   
                                                    }   
                                    }   
    为什么只有我点击DataGridView的排序,或者是拖动一下DataGridView的列宽,数据才显示出来, 
    但是如果我把开启线程的语句写到Form_load里面就可以显示,为什么写到Button_Click事件 
    里面就不显示那。谁能解决上面的问题,分就是谁的。
      

  17.   

    我来领个分 跨线程访问控件 在2.0中需要使用委托方法
    private  void  Form2_Load(object sender,EventArgs e)       
    {       
                                                                                                      dataGridView2.DataSource = dtRate;  
    }     private delegate void SetDvCallBack();
            
            private void addData()
            {
                if (this.dataGridView2.InvokeRequired)
                {
                    SetDvCallBack d = new SetDvCallBack(addData);
                    this.Invoke(d);
                }
                else
                {
                    
                    for (int i = 0; i < 10; i++)
                    {
                        DataRow drRate = dtRate.NewRow();
                        drRate[0] = 66 + i.ToString();
                        drRate[1] = 66 + i.ToString();
                        drRate[2] = 66 + i.ToString();
                        drRate[3] = 66 + i.ToString();
                        dtRate.Rows.Add(drRate);
                    }
                }
               
            }                                                                      
      

  18.   

    faint 好多的自动加上去的空格……