C# 异步读取数据库里面的数据与绑定UI的解决办法
2011-07-24 10:09
751 查看
异步读取数据库,在数据绑定的时候会出现点问题,就是窗体界面会无法关闭,要结束任务才能结束进程。例如下面代码
首先按习惯的方法,设定线程更新UI
a2.CheckForIllegalCrossThreadCalls = false; //a2为窗体名称
下面的代码就是从数据库里取得数据并绑定
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con;
SqlCommand com;
try
{
con = new SqlConnection("UID=sa;Password=123;Initial Catalog=AD;Data Source=192.168.1.1;Asynchronous Processing=true");
con.Open();
com = new SqlCommand("select top 100 * from tb_user", con);
com.BeginExecuteReader(new AsyncCallback(delDataBin), com);
}
catch (Exception ex)
{
MessageBox.Show("程序发生错误,信息: " + ex.Message);
}
}
private void delDataBin(IAsyncResult ar)
{
if (ar.IsCompleted)
{
SqlCommand com = (SqlCommand)ar.AsyncState;
SqlDataReader dr = com.EndExecuteReader(ar);
DataTable dt = new DataTable();
dt.Load(dr);
dr.Close();
this.dataGridView1.DataSource = dt; //绑定数据
}
}
到这里完成的绑定的工作,运行查看一下效果,其实这样是会出现窗体假死的现象。
下面通过Invoke 来实现
首先声明委托 public delegate void updateDG(DataTable dt);
然后通过dataBin来绑定DataGridView
public void dataBin(DataTable dt)
{
dataGridView1.DataSource = dt;
return;
}
在线程里面调用下面方法
//绑定数据
if (this.InvokeRequired)
{
updateDG ur = new updateDG(dataBin);
this.Invoke(ur, dt);
}
完整的代码如下:
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con;
SqlCommand com;
try
{
con = new SqlConnection("UID=sa;Password=123;Initial Catalog=AD;Data Source=192.168.1.1;Asynchronous Processing=true");
con.Open();
com = new SqlCommand("select top 100 * from tb_user", con);
com.BeginExecuteReader(new AsyncCallback(delDataBin), com);
}
catch (Exception ex)
{
MessageBox.Show("程序发生错误,信息: " + ex.Message);
}
}
private void delDataBin(IAsyncResult ar)
{
if (ar.IsCompleted)
{
SqlCommand com = (SqlCommand)ar.AsyncState;
SqlDataReader dr = com.EndExecuteReader(ar);
DataTable dt = new DataTable();
dt.Load(dr);
dr.Close();
//this.dataGridView1.DataSource = dt;//绑定数据
if (this.InvokeRequired)
{
updateDG ur = new updateDG(dataBin);
this.Invoke(ur, dt);
}
}
}
public delegate void updateDG(DataTable dt);
public void dataBin(DataTable dt)
{
dataGridView1.DataSource = dt;
return;
}
查运行查看一下,你就会发现结果了
首先按习惯的方法,设定线程更新UI
a2.CheckForIllegalCrossThreadCalls = false; //a2为窗体名称
下面的代码就是从数据库里取得数据并绑定
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con;
SqlCommand com;
try
{
con = new SqlConnection("UID=sa;Password=123;Initial Catalog=AD;Data Source=192.168.1.1;Asynchronous Processing=true");
con.Open();
com = new SqlCommand("select top 100 * from tb_user", con);
com.BeginExecuteReader(new AsyncCallback(delDataBin), com);
}
catch (Exception ex)
{
MessageBox.Show("程序发生错误,信息: " + ex.Message);
}
}
private void delDataBin(IAsyncResult ar)
{
if (ar.IsCompleted)
{
SqlCommand com = (SqlCommand)ar.AsyncState;
SqlDataReader dr = com.EndExecuteReader(ar);
DataTable dt = new DataTable();
dt.Load(dr);
dr.Close();
this.dataGridView1.DataSource = dt; //绑定数据
}
}
到这里完成的绑定的工作,运行查看一下效果,其实这样是会出现窗体假死的现象。
下面通过Invoke 来实现
首先声明委托 public delegate void updateDG(DataTable dt);
然后通过dataBin来绑定DataGridView
public void dataBin(DataTable dt)
{
dataGridView1.DataSource = dt;
return;
}
在线程里面调用下面方法
//绑定数据
if (this.InvokeRequired)
{
updateDG ur = new updateDG(dataBin);
this.Invoke(ur, dt);
}
完整的代码如下:
private void button1_Click(object sender, EventArgs e)
{
SqlConnection con;
SqlCommand com;
try
{
con = new SqlConnection("UID=sa;Password=123;Initial Catalog=AD;Data Source=192.168.1.1;Asynchronous Processing=true");
con.Open();
com = new SqlCommand("select top 100 * from tb_user", con);
com.BeginExecuteReader(new AsyncCallback(delDataBin), com);
}
catch (Exception ex)
{
MessageBox.Show("程序发生错误,信息: " + ex.Message);
}
}
private void delDataBin(IAsyncResult ar)
{
if (ar.IsCompleted)
{
SqlCommand com = (SqlCommand)ar.AsyncState;
SqlDataReader dr = com.EndExecuteReader(ar);
DataTable dt = new DataTable();
dt.Load(dr);
dr.Close();
//this.dataGridView1.DataSource = dt;//绑定数据
if (this.InvokeRequired)
{
updateDG ur = new updateDG(dataBin);
this.Invoke(ur, dt);
}
}
}
public delegate void updateDG(DataTable dt);
public void dataBin(DataTable dt)
{
dataGridView1.DataSource = dt;
return;
}
查运行查看一下,你就会发现结果了
相关文章推荐
- C# 异步读取数据库里面的数据与绑定UI的解决办法
- C# 异步读取数据库里面的数据与绑定UI的解决办法
- C#中DataGridView绑定了DataTable后,通过代码修改DataGridView中的数据,总有一行(被修改过并被用户选中的行集合中索引为0的行)不能被UpDate回数据库的问题和解决办法
- c# 在datagridview中添加comboboxcolumn 绑定数据库读取显示数据
- C#使用access数据库,bin下的数据库和工程目录下数据库数据不同步解决办法
- c#异步读取数据库与异步更新ui的代码实现
- C# 读取含中文字符的数据,失败原因,和解决办法
- hadoop超时解决办法context.progress()的作用 假设在map()方法中,你有一个从数据库读取大量数据的操作,是用一个循环来完成的,并且,在读完全部的数据之前,你不会有任何的数据输出
- C#.net读取Excel表中的数据时,有些字段内容(字符串、数字)读取不到的解决办法
- DataTable 数据导入MS ACCESS 数据库中 数字类型字段为空的解决办法
- JSP能往数据库中写入数据无法修改数据的解决办法
- C#:使用ListView动态添加数据一直闪烁的解决办法
- 用c#读取excel中的数据插入到数据库中
- C#与SQL Server之间的数据类型对比及在VS2003中空值传递的解决办法
- C#无法对Paradox数据库进行操作的解决办法
- 由于您和其他用户试图同时改变同一数据,导致 Microsoft Jet 数据库引擎停止进程解决办法
- 利用JPA注解插入数据进数据库时报detached entity passed to persist的解决办法
- SSH项目中向数据库写中文数据时出现乱码解决办法
- C#中使用seriport和单片机进行串口长数据收发不全,解决办法
- CascadingDropDown从数据库中读取数据绑定到DropDownList控件上