DataGridView分次加载数据

来源:互联网 发布:mmap软件下载 mac 编辑:程序博客网 时间:2024/05/16 01:37

例如,有上千条记录,如果一次性加载,势必会影响效率,分页读取似乎能解决问题,但是在DataGridView中加上分页按钮也比较麻烦。此前,使用过Oracle Form,一次会显示一些数据,而当数据比较多时,可以通过滚动条继续加载数据,我觉得这种实现方式比较好。

1、首先找到DataGridView的滚动条事件

这个比较好找,dataGridViewX1_Scroll(object sender, ScrollEventArgs e)

2、获得DataGridView当前显示数据中的最后一行的行号

this.dataGridViewX1.Rows.GetLastRow(DataGridViewElementStates.Displayed);

3、定义变量

private int tc;//记录总数
private int pageSize;//每次读取记录数
private int pageNo;//分页号

4、第一次仅装载pageSize条记录,并给tc赋值

loadData();

5、此后当滚动到最后一条记录并且还存在未加载记录时,再次加载记录

int lastRowNum = this.dataGridViewX1.Rows.GetLastRow(DataGridViewElementStates.Displayed);
if (lastRowNum > (pageNo * pageSize - 5) && lastRowNum < tc)

loadOtherData();

6、往dataSet中追加记录

DataTable dt = new DataTable("Vendor");

adapter.Fill(dt);
//继续加载记录
foreach (DataRow row in dt.Rows)
{
       dataSet1.Tables["Vendor"].ImportRow(row);
}

7、Sql Server 2005中分页

select top 100 * from (
select ROW_NUMBER() OVER (ORDER BY tb.cCusCode ASC) as ROWID,tb.cCusCode,tb.cCusName,tb.cCusAbbName,tb.cCusAddress,tb.cCusAccount,tb.cCusBank,tb.dCusDevDate
from Customer tb) aa
where (aa.ROWID >
(select isnull(max(ta.ROWID),0)
from (select top 100 ROW_NUMBER() OVER (ORDER BY tc.cCusCode ASC) AS ROWID,tc.cCusCode from Customer tc where 1=1  order by tc.cCusCode) ta))  
order by aa.cCusCode

这里,由于cCusCode是字符型的,如果是自增的id,就不必这么麻烦通过ROW_NUMBER() OVER (ORDER BY tb.cCusCode ASC)获得行RowId了。

综上所述,结合分页和Scroll事件,可以实现分次加载数据。

当滚动条移动到第195条记录时,会自动加载下一个pageSize的记录



原创粉丝点击