如何从底层的datatable更新上层的datagridview

     使用微软 SQL SERVER MANAGEMENT Studio的人都经常发现,他打开表显示数据的速度很快,而且,如果有数万条记录不能立即显示时,数据表格会自动的加载数据,而不影响整个界面的操作,那么这个效果是如何完成的呢?

   肯定的一点是,他用到了多线程,数据的提取线程和界面操作不在一个线程中,这样就可以做到数据随提取,随时送到界面的表格控件中。

   实现的方式就不废话了,给个代码,大家自然很容易就看懂了

 

 public partial class Form2 : Form
    {
        private DDD _D;

        public Form2()
        {
            InitializeComponent();
            _D = new DDD();
            dataGridView1.DataSource = _D;
            
              _D.HasNewdata += new EventHandler(d_HasNewdata);      // 关键是加载一定数据后向表格控件发出通知,以便其确认数据的更新

        }

        void d_HasNewdata(object sender, EventArgs e)
        {
            if (dataGridView1.InvokeRequired)
            {
                EventHandler p = new EventHandler(d_HasNewdata);
                dataGridView1.Invoke(p,sender,e );
            }
            else
            {
 

                dataGridView1.Refresh();
 
                    _D.AcceptChanges();                      //要使用确认更新,表格才能正确显示
            }
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            _D.GenData();
        }
    }

    class DDD:DataTable
    {
        
        public event EventHandler HasNewdata;
        private void SendInfo()
        {
            HasNewdata.Invoke(this , new EventArgs());
        }
        private ManualResetEvent _WC1 = new ManualResetEvent(false );
        public DDD()
        {
            this.Columns.Add("d1");
            this.Columns.Add("d2");
            this.Columns.Add("d3");
            this.Columns.Add("d4");
            this.Columns.Add("d5");
   
        }

 

        public void GenData()
        {

 
            Thread t = new Thread(new ThreadStart(G2));
            t.Start();
         
        }


        private void G2()
        {
            List <object[] > x =new List<object[]> ();

            for (int i = 0; i < 1000; i++)
            {                
                string a = string.Format ("d1_{0}",i);
                string b = string.Format ("d2_{0}",i);
                string c = string.Format ("d3_{0}",i);
                string d = string.Format ("d4_{0}",i);
                string e = string.Format("d5_{0}", i);

                object[] t = new object[5] { a, b, c, d,e  };
                x.Add(t);
            }
            int j = 0;
            SendInfo(  );
            foreach (object[] p in x)
            {
                j++;

                this.Rows.Add(p);
                if (j == 100)                                  //可以任选间隔显示的频率
                {
                    SendInfo(  );
                    j = 0;
                }
           
            }
            SendInfo(  );
        }

    }

 

另:该程序在实际运行时会发现在VS.NET环境下运行很好,但直接运行有时会卡死,现象是一出scrollbar就死,解决的方法很多,我想到的方法如下:

经测试使用AcceptChange会搞死界面,但使用scrollbar= both时就不会,可以先时dgv的scrollbar=none, 在显示行数超出当前窗体时再invoke出scrollbar=both来即可。

 

posted @ 2012-02-26 21:39  窗户纸  阅读(168)  评论(0编辑  收藏  举报