例如,有上千条记录,如果一次性加载,势必会影响效率,分页读取似乎能解决问题,但是在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的记录