c#用datagradview实时监控后台数据的变化然后显示在datagradview上。但是我使用的是多线程的方式、但由于数据的显示仍然在ui上执行,所以会出现卡死的情况。
我把datagradview改为virtual mode的方式,仍然不顺畅。并且更新的时候需要点击datagradview才能数据变化。代码:private void YcMainFrm_Load(object sender, EventArgs e){
if (_RefreshThread == null)
                {
                    _RefreshThreadStart = new ThreadStart(temperatureDataRefresh);
                    _RefreshThread = new Thread(_RefreshThreadStart);
                    _RefreshThread.Start();
                }                dataGridView1.Dock = DockStyle.Fill;                //设置DataGridView的行数
                dataGridView1.RowCount = tempdataGridTd.Rows.Count;
}        private void temperatureDataRefresh()
        {
            try
            {
                while (true)
                {
                    tempdataGridTd = SQLiteHelper.ExecuteDataSet(sqlStrTemperature).Tables[0];
                    temperatureDataEdit();                    Thread.Sleep(refreshTime);
                }
            }
            catch (Exception ex)
            {
                LogManager.error(ex.Message, this.ToString(), "temperatureDataRefresh()");
            }
        }        private void temperatureDataEdit()
        {
            try
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(new myDelegate(temperatureDataEdit));
                }
                else
                {
                   //其他处理                }            }
            catch (Exception ex)
            {
                LogManager.error(ex.Message, this.ToString(), "temperatureDataEdit()");
            }
        }private void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
            try
            {
                if (e.RowIndex == dataGridView1.RowCount)
                {
                    return;
                }                // 从记录集中读取数据   
                string colName = dataGridView1.Columns[e.ColumnIndex].DataPropertyName;
                e.Value = tempdataGridTd.Rows[e.RowIndex][colName].ToString();            }
            catch (Exception ex)
            {
                LogManager.error(ex.Message, this.ToString(), "dataGridView1_CellValueNeeded()");
            }
        }

解决方案 »

  1.   

    DataTable绑定datagradview,用定时器!定时器处理方法里:
    1、需更新这个DataTable,
    2、重新绑定:
       datagradview.DataSource=null;
       datagradview.DataSource=DataTable;
      

  2.   

    不要用绑定方式,直接 dataGridView1.Rows.Add()
      

  3.   

    其实你可以换位考虑
    1.数据显示用 dataGridView的话,你绑定数据表,只是第一次运行时加载的数据可能有点卡。
    2.实时显示你的数据的变化,不必操作dataGridView,只要操作DataSource就可了。
    也就说如你绑定表table
    table=(DataTable)dataGridView.DataSource;
    只要你table.Rows.Add(newrow)这种方法dataGridView会实时增加行,新行数量不是直分大时不会有卡的现象当然你可用SQL计划任务或用Timer定时更新。
      

  4.   

    使用mvc 模式就行了。另,如果不想麻煩,就用Timer好了,如果數據量不太大。直接 full(DataTable).
    dataGridView.DataSource=null;
    dataGridView.DataSource=TD;
    dataGridView.Refush();
      

  5.   


    目前我使用的是cs结构的。前段时间提问这个问题的时候,有人这么回复的:用virtual mode+数据绑定,数据源上实现IBindingList,数据源的行上实现INotifyPropertyChanged 不过我没有看懂,请各位帮我看看。贴子地址:http://topic.csdn.net/u/20111105/08/ff68aa7a-385f-4d12-88a1-9b8e4046d5c2.html