关于datagridview加载数据的问题

yhl2133156 2011-08-04 11:23:38
datagridview加载显示数据的时候,如果数据量很大,怎么实现异步加载,并且在后台加载显示数据时,把任务进度显示在progressbar上
...全文
137 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdl2005lyx 2011-08-04
  • 打赏
  • 举报
回复
问题的本质:是数据太大,太多,从数据库读取出来要消耗很多时间,用哪个线程,这个时间都少不了!
yhl2133156 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sdl2005lyx 的回复:]
用代码实现分页:

private int pageSize = 0; //每页显示行数
private int pageCurrent = 0; //当前页号
private int pageCount = 0; //页数=总记录数/每页显示行数
private int nCurrent = 0; //当前记录行号
private int nMax = 0; //……
[/Quote]

我新建了一个线程去执行,一些Dataset的整理工作,由于在datagridview数据加载过程是ui线程在控制,难道就不能用另一个线程去操作吗?
如果不能就只能分页了。
yhl2133156 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangyue4 的回复:]
http://www.huanghengxu.com/Html/Article/57.htm
用BackgroundWorker
[/Quote]

我新建了一个线程去执行,一些Dataset的整理工作,由于在datagridview数据加载过程是ui线程在控制,难道就不能用另一个线程去操作吗?
如果不能就只能分页了。
sdl2005lyx 2011-08-04
  • 打赏
  • 举报
回复
用代码实现分页:

private int pageSize = 0; //每页显示行数
private int pageCurrent = 0; //当前页号
private int pageCount = 0; //页数=总记录数/每页显示行数
private int nCurrent = 0; //当前记录行号
private int nMax = 0; //总记录数
private DataTable srcTable = null; //元数据

private void InitPageSet()
{
pageSize = 30; //设置页面行数
nMax = srcTable.Rows.Count;
pageCount = (nMax / pageSize); //计算出总页数

if ((nMax % pageSize) > 0)
{
pageCount++;
}

pageCurrent = 1; //当前页数从1开始
nCurrent = 0; //当前记录数从0开始

First.Enabled =false;
Prev.Enabled = false;

bool b = pageCurrent == pageCount ? false : true;
Next.Enabled = b;
End.Enabled = b;
}

private DataTable LoadPageData()
{
int nStartPos = 0; //当前页面开始记录行
int nEndPos = 0; //当前页面结束记录行
DataTable dtTemp = null;
if (srcTable == null || srcTable.Rows.Count == 0)
return srcTable;
try
{
dtTemp = srcTable.Clone(); //克隆DataTable结构框架
if (pageCurrent == pageCount)
{
nEndPos = nMax;
}
else
{
nEndPos = pageSize * pageCurrent;
}

nStartPos = nCurrent;
//从元数据源复制记录行
for (int i = nStartPos; i < nEndPos; i++)
{
dtTemp.ImportRow(srcTable.Rows[i]);
nCurrent++;
}

textEdit1.Text = pageCurrent.ToString();
Page.Text = string.Format("/{0}页", pageCount);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "LoadPageData");
}
return dtTemp;
}
private void First_Click(object sender, EventArgs e)
{
try
{
pageCurrent = 1; //当前页数从1开始
nCurrent = 0; //当前记录数从0开始

if (srcTable == null || srcTable.Rows.Count == 0)
return;

DataTable table = LoadPageData();
ChangeDataSoure(table);

First.Enabled =false;
Prev.Enabled = false;
Next.Enabled = true;
End.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void Prev_Click(object sender, EventArgs e)
{
try
{
pageCurrent--;
nCurrent = pageSize * (pageCurrent - 1);

if (srcTable == null || srcTable.Rows.Count == 0)
return;
DataTable table = LoadPageData();
ChangeDataSoure(table);

bool b= pageCurrent <= 1 ? false:true;
First.Enabled = b;
Prev.Enabled = b;
Next.Enabled = true;
End.Enabled = true;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void Next_Click(object sender, EventArgs e)
{
try
{
pageCurrent++;
nCurrent = pageSize * (pageCurrent - 1);

if (srcTable == null || srcTable.Rows.Count == 0)
return;
DataTable table=LoadPageData();
ChangeDataSoure(table);

bool b= pageCurrent >= pageCount ? false : true;
Next.Enabled = b;
End.Enabled = b;

First.Enabled = true;
Prev.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void End_Click(object sender, EventArgs e)
{
try
{
pageCurrent = pageCount;
nCurrent = pageSize * (pageCurrent - 1);

if (srcTable == null || srcTable.Rows.Count == 0)
return;

DataTable table = LoadPageData();
ChangeDataSoure(table);

Next.Enabled =false;
End.Enabled = false;
First.Enabled = true;
Prev.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
wangyue4 2011-08-04
  • 打赏
  • 举报
回复
kid_wang 2011-08-04
  • 打赏
  • 举报
回复
数据库里存储过程分页去吧。

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧