如何实现DataGridView实时更新数据
最近一直在研究调度 涉及到用调度实时给客户发送短信的功能 其中就有用到实时更新的显示发送状态的 当然 今天不是以QUARTE为主主要控件有 datagridview checkbox picturebox trackBar1 label
datagridview :实时显示数据
checkbox :指示是否停止更新
picturebox :显示更新状态
trackBar1 :设置更新时间频率
label :显示一些相关信息
有时候我们希望能够实时的去更新一些信息 大家可能会想到Timer 但是这样做会使界面很卡 影响效果和交互性 怎样才能让它不卡又能实时更新呢
线程
主要代码如下
程序代码:
using System; using System.Collections.Generic; using using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace WinMilkProject.Project { public partial class Form1 : Form { Thread myThread; public int frequency = 0;//更新时间频率 public static bool isUse = false;//是否停止更新 public static string statusInfo = string.Empty;//状态 private delegate void myDelegate(DataTable dt);//定义委托 public Form1() { InitializeComponent(); label2.Text = "更新频率为:" + (trackBar1.Value / 1000).ToString() + "秒"; } private void Form1_Load(object sender, EventArgs e) { myThread = new Thread(startFillDv);//实例化线程 myThread.Start(); } private void startFillDv() { while (true) { if (isUse) { statusInfo = "正在实时更新数据......"; DataTable dt = CommonEx.GetDataTableEx("select * from table1");//自己写的数据封装类 能够返回一个datatable Grid(dt); Thread.Sleep(frequency); } else { statusInfo = "停止更新!"; } } } private void Grid(DataTable dt) { if (this.InvokeRequired) { this.Invoke(new myDelegate(Grid), new object[] { dt }); } else { try { this.dataGridView1.DataSource = null; this.dataGridView1.DataSource = dt; dt = null; statusInfo = "更新完成!"; } catch { } } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { if (this.myThread.IsAlive) { this.myThread.Abort();//结束线程 } } private void timer1_Tick(object sender, EventArgs e) { label1.Text = statusInfo; frequency = trackBar1.Value; if (statusInfo.Trim() == "正在实时更新数据......") { pictureBox1.Visible = true; } else { pictureBox1.Visible = false; } } private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.Checked) { isUse = true; } else { isUse = false; } } private void trackBar1_Scroll(object sender, EventArgs e) { label2.Text = "更新频率为:" + (trackBar1.Value / 1000).ToString() + "秒"; } } }
[ 本帖最后由 wangnannan 于 2011-6-1 16:52 编辑 ]