使用微软 SQL SERVER MANAGEMENT Studio的人都经常发现,他打开表显示数据的速度很快,而且,如果有数万条记录不能立即显示时,数据表格会自动的加载数据,而不影响整个界面的操作,那么这个效果是如何完成的呢?
肯定的一点是,他用到了多线程,数据的提取线程和界面操作不在一个线程中,这样就可以做到数据随提取,随时送到界面的表格控件中。
实现的方式就不废话了,给个代码,大家自然很容易就看懂了
public partial class Form2 : Form
{
private DDD _D;
public Form2()
{
InitializeComponent();
_D = new DDD();
dataGridView1.DataSource = _D;
_D.HasNewdata += new EventHandler(d_HasNewdata); // 关键是加载一定数据后向表格控件发出通知,以便其确认数据的更新
}
void d_HasNewdata(object sender, EventArgs e)
{
if (dataGridView1.InvokeRequired)
{
EventHandler p = new EventHandler(d_HasNewdata);
dataGridView1.Invoke(p,sender,e );
}
else
{
dataGridView1.Refresh();
_D.AcceptChanges(); //要使用确认更新,表格才能正确显示
}
}
private void Form2_Load(object sender, EventArgs e)
{
_D.GenData();
}
}
class DDD:DataTable
{
public event EventHandler HasNewdata;
private void SendInfo()
{
HasNewdata.Invoke(this , new EventArgs());
}
private ManualResetEvent _WC1 = new ManualResetEvent(false );
public DDD()
{
this.Columns.Add("d1");
this.Columns.Add("d2");
this.Columns.Add("d3");
this.Columns.Add("d4");
this.Columns.Add("d5");
}
public void GenData()
{
Thread t = new Thread(new ThreadStart(G2));
t.Start();
}
private void G2()
{
List <object[] > x =new List<object[]> ();
for (int i = 0; i < 1000; i++)
{
string a = string.Format ("d1_{0}",i);
string b = string.Format ("d2_{0}",i);
string c = string.Format ("d3_{0}",i);
string d = string.Format ("d4_{0}",i);
string e = string.Format("d5_{0}", i);
object[] t = new object[5] { a, b, c, d,e };
x.Add(t);
}
int j = 0;
SendInfo( );
foreach (object[] p in x)
{
j++;
this.Rows.Add(p);
if (j == 100) //可以任选间隔显示的频率
{
SendInfo( );
j = 0;
}
}
SendInfo( );
}
}
另:该程序在实际运行时会发现在VS.NET环境下运行很好,但直接运行有时会卡死,现象是一出scrollbar就死,解决的方法很多,我想到的方法如下:
经测试使用AcceptChange会搞死界面,但使用scrollbar= both时就不会,可以先时dgv的scrollbar=none, 在显示行数超出当前窗体时再invoke出scrollbar=both来即可。
分享到:
相关推荐
解决 datatable 不按字段顺序 绑定 datagridview的问题
datatable、datagridview导出为csv,高效快速,比导出为excel效率高,同时由能用excel操作
本程序详细描述了excel转化成datatable 并加载到datagridview 中的实现过程,简单便捷,代码完整,下载之后运行即可
DataGridView或DataTable导出为Excel-处理了数字字符串去掉前面0的问题-支持进度条
打印datagridview datatable
Datagridview与Datatable同步排序
1、修改数据 代码如下: DataRow dr = hRDataSet.Tables[“emp”].Rows.Find(textBox3.Text); //DataRow dr = hRDataSet.Tables[“emp”].Select(“id=”+textBox3.Text)[0]; dr.BeginEdit();...
DataTable dt = ds.Tables[biaom.Trim()]; DataRow myrow = ds.Tables[biaom.Trim()].NewRow(); for (int j = 0; j < dataGridView1.Columns.Count; j++) { myrow[j] = Convert.ToString(dataGridView1.Rows[i]...
C# datagridview 与数据源绑定后对数据的,增加,删除,插入,更新C# datagridview 与数据源绑定后对数据的,增加,删除,插入,更新
使用C#直接对DataTable进行操作,实现了sql语句的update tabel set name = 'Clear_Mind' where id 的功能。
C# Winform使用DataGridView的VirtualMode虚拟模式。 有两种数据类型作为DataGridView的数据源,一种是DataTable,一种是List。有不明白的,欢迎加微信交流:VPAmway。
将DataGridView或DataTable导出为Excel支持进度条[参考].pdf
ExcelOpera类操作简单,实用; 将DataTable DataGridView 导出到Excel表格;
把datagridview 转换成 datatable 或者 dataset
本控件实现了简单的分页技术 通过公共函数SetControl(DataTable SqlDataTable, DataGridView datagridview)进行首次加载数据分页
经过对Excel深入了解,采用数据写入到range的方法,效率更高,更明显,改进后,效率提高N倍,在VS2005中测试8000条数据大约需要2...我是用DataGridViewX来显示数据的,如果你们没有这个控件的话用DataGridView也是一样的
本文以实例形式讲述了使用DataSet Datatable更新数据库的三种实现方法,包括CommandBuilder 方法、DataAdapter 更新数据源以及使用sql语句更新。分享给大家供大家参考之用。具体方法如下: 一、自动生成命令的条件 ...
一个简单的datagridview绑定datatable数据,添加合计行,后可排序.
C#从datatable到listview的方法