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()");
}
}
我把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()");
}
}
解决方案 »
- 新手求助 给listview添加独立的vscrollbar 怎样实现滑动
- C#链接MYSQL的乱码问题
- VS2005能做简单的手机应用吗?
- 大家帮我看看这段代码
- API画弧
- protected override void OnPaint(PaintEventArgs e)这个类是自己建的还是程序自动生成的啊?
- 用什么简易设备可以测试Com口的读写?
- VS.NET2003中的属性或解决方案资源管理器等一系列窗口,按小按钮后可以固定位置,或当鼠标over时才伸展出来,没有over时就自动缩加隐藏,
- C#中一种特殊的窗体调用并传参数的问题!!
- C++语言转C#的一个难题.
- 水晶报表展示问题
- 大家都怎么架构.net信息系统架构的
1、需更新这个DataTable,
2、重新绑定:
datagradview.DataSource=null;
datagradview.DataSource=DataTable;
1.数据显示用 dataGridView的话,你绑定数据表,只是第一次运行时加载的数据可能有点卡。
2.实时显示你的数据的变化,不必操作dataGridView,只要操作DataSource就可了。
也就说如你绑定表table
table=(DataTable)dataGridView.DataSource;
只要你table.Rows.Add(newrow)这种方法dataGridView会实时增加行,新行数量不是直分大时不会有卡的现象当然你可用SQL计划任务或用Timer定时更新。
dataGridView.DataSource=null;
dataGridView.DataSource=TD;
dataGridView.Refush();
目前我使用的是cs结构的。前段时间提问这个问题的时候,有人这么回复的:用virtual mode+数据绑定,数据源上实现IBindingList,数据源的行上实现INotifyPropertyChanged 不过我没有看懂,请各位帮我看看。贴子地址:http://topic.csdn.net/u/20111105/08/ff68aa7a-385f-4d12-88a1-9b8e4046d5c2.html