引用:http://xtuhuajx.blog.163.com/blog/static/25504754200851210120611/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Threading;
using System.Data.SqlClient;
namespace TestForm
{
public partial class Form1 : Form
{
//定义一个变量,用于关闭线程
private bool flag;
//定义一个线程
private Thread thread;
//定义一个委托
public delegate void MyInvoke(DataSet ds);
public Form1()
{
InitializeComponent();
flag = true;
thread = new Thread(new ThreadStart(threadProc));
thread.Start();
}
//线程回调函数
private void threadProc()
{
while (flag)
{
//三秒种一次
DataBind();
Thread.Sleep(3000);
}
}
//操作DataGridView
private void BindDataGridView(DataSet ds)
{
this.dataGridView1.DataSource = ds.Tables["student"];
}
//从数据库中取出数据,并绑定
private void DataBind()
{
SqlConnection con = new SqlConnection("server=.;database=student;uid=sa;pwd=0421");
try
{
con.Open();
SqlDataAdapter sda = new SqlDataAdapter("select * from studentInfor", con);
DataSet ds = new DataSet();
sda.Fill(ds, "student");
//this.dataGridView1.DataSource = ds.Tables["student"];
//绑定数据到DataGridView
MyInvoke mi = new MyInvoke(BindDataGridView);
this.BeginInvoke(mi, new object[] { ds });
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
private void button1_Click(object sender, EventArgs e)
{
//测试,添加一条数据,看隔一段时间后,能否取上来..
SqlConnection con = new SqlConnection("server=.;database=student;uid=sa;pwd=0421");
try
{
con.Open();
SqlCommand cmd = new SqlCommand("insert into studentInforvalues('1111111','test')", con);
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//关闭前先关闭线程
flag = false;
thread.Join();
}
}
}
【liujia_0421】:
TO:测试那个线程的方法出现这样的错误:
线程间操作无效: 从不是创建控件“dataGridView1”的线程访问它。
不好意思,开始没想这么多,确实不能在线程中操作控件的,但有时测试是可以通过的,虽然测试通过了,但没有检查...
现在改过了,利用委托,与前面的代码,改的地方有三:
1.//定义一个委托
public delegate void MyInvoke(DataSet ds);
2.写了一个专门操作DataGridView的函数
//操作DataGridView
private void BindDataGridView(DataSet ds)
{
this.dataGridView1.DataSource = ds.Tables["student"];
}
3.在DataBind函数中将操作DataGridView的代码改用委托来实现:
//***********注意这句被注释起来了**********************//
//this.dataGridView1.DataSource = ds.Tables["student"];
//*************************************