你要显示的数据应该是保存在一个List集合里的,只需要把新查询出的数据加入到原本数据的集合中,在调用adapternotifyDataSetChange()方法就可以了。
估计你是用第二页的数据替换带第一页的数据了或是把第二页的数据放到集合前面了。
首先,一个列表里面有7万格项目是不合理的,因为你将没有办法通过拖动滚动条来准确定位,毕竟7万条记录的list滚动条得多小啊
其次,如果非要显示的话,建议使用异步填充,先组织好一批数据,然后填充这一批,期间UI线程还是可以相应的,这样虽然速度没有提升,但是用户体验会好一些
再次,如果要求必须一次填充完成的话,在开始填充时使用SuspendLayout(),挂起更新画面项目,然后在填充完以后ResumeLayout(true)恢复更新画面,并将前面挂起的画面更新恢复。这样可以一定程度上节省更新的时间。
thislistviewSampleSuspendLayout();
thisLoadListData();
thislistviewSampleResumeLayout(true);
Ps: IsPostback是BS系统上面的,在你的Winform上没有意义。金山词霸采用的是我说的第二种方案配合第三种方案,只加载一小部分,在你拖动滚动条的时候填充当前滚动条指定的那一段。相当于分页。
namespace seperatePage
{
public partial class Form1 : Form
{
string sql;
SqlConnectionStringBuilder bldr;
SqlConnectioncn;
int totalcount = 0;//记录总共的记录数
static int page =0; //记录现在翻到第几页了
public Form1()
{
InitializeComponent();
linkDatabase();
}
public void linkDatabase()
{//连接数据库,打开连接
bldr = new SqlConnectionStringBuilder();
bldrDataSource = "1258925550";
bldrInitialCatalog = "shortmessage";
bldrIntegratedSecurity = false;
bldrUserID = "shortmessage";
bldrPassword = "shortmessageuser";
cn = new SqlConnection(bldrConnectionString);
cnOpen(); }
public void closeDatabase()
{
//关闭连接
cnClose();
}
public DataSet selectData(String sql)
{
//查询数据集
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(sql, cn);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
daFill(ds);
return ds;
}
private void Form1_Load(object sender, EventArgs e)
{
//窗体加载的时候,前5条记录是显示的。这时候,“下一页”是可用的,“上一页”是不可用的。
nextPageEnabled = true ;
prevPageEnabled = false;
listView1GridLines = false;
listView1ColumnsAdd("name");
listView1ColumnsAdd("age");
listView1ColumnsAdd("rollno");
listView1View =ViewDetails;
listView1ItemsClear();
sql = "select from test";
DataSet ds_one = selectData(sql);
DataTable dt_one = ds_oneTables[0];
for (int i = 0; i < dt_oneRowsCount; i++)
{
totalcount = totalcount+1;//查看一共有多少条记录。
}
sql = "select top 5 name,age,rollno fromtest "; //显示前5条信息
DataSet ds = selectData(sql);
write_listview(ds); //这个函数的作用是用来往listview中写数据的。
}
private void next_LinkClicked(object sender,LinkLabelLinkClickedEventArgs e)
{
//当点击下一页时,上一页是可用的。
prevPageEnabled = true;
//记录有可能是被5整除的,有可能是不能被5整除,所以判断下一页是否可用需要分情况
if (totalcount % 5 == 0)
{
if (page >= totalcount / 5 - 2)
{
nextPageEnabled = false;
prevPageEnabled = true;
}
}
else
{
if (page >= totalcount / 5 - 1)
{
nextPageEnabled = false;
prevPageEnabled = true;
}
}
page = page +1;
listView1ItemsClear();
sql = "select top 5name,age,rollno from test where rollno not in (select top"+page5+" rollno fromtest)";
DataSet ds = selectData(sql);
write_listview(ds);
}
private void linkLabel2_LinkClicked(object sender,LinkLabelLinkClickedEventArgs e)
{
nextPageEnabled = true;
page = page -1;
if (page <= 0)
{
nextPageEnabled = true ;
prevPageEnabled = false ;
}
listView1ItemsClear();
sql = "select top 5name,age,rollno from test where rollno not in (select top " + page 5 + " rollno fromtest)";
DataSet ds = selectData(sql);
write_listview(ds);
}
private void firstPage_LinkClicked(object sender,LinkLabelLinkClickedEventArgs e)
{
listView1ItemsClear();
prevPageEnabled = false;
nextPageEnabled = true;
sql = "select top 5 name,age,rollno from test";
page =0;//必须要写,否则page会出现问题。
DataSet ds = selectData(sql);
write_listview(ds);
}
private void write_listview(DataSet ds)
{//用于完成向listview添加信息。
ListViewItem lv = null;
DataTable dt = dsTables[0];
for (int i = 0; i < dtRowsCount; i++)
{
lv = new ListViewItem(dtRows[i]["name"]ToString());
lvSubItemsAdd(dtRows[i]["age"]ToString());
lvSubItemsAdd(dtRows[i]["rollno"]ToString());
listView1ItemsAdd(lv);
}
}
private void lagePage_LinkClicked(object sender,LinkLabelLinkClickedEventArgs e)
{
if (totalcount % 5 == 0)
{
page = totalcount / 5 - 1;
}
else
{
page = totalcount / 5;
}
nextPageEnabled = false;
prevPageEnabled = true;
listView1ItemsClear();
sql = "select top 5 name,age,rollno from test where rollno not in(select top " + page 5 + " rollno fromtest)";
DataSet ds = selectData(sql);
write_listview(ds);
}
}
}
其实和数据库分页没有什么不同,原理是一样的。
首先读取文本的行数到一个变量,如果每页分15行,那么总页数是(行数\15)+1,声明一个字符性数组,例如AX(),根据总页数:ReDim AX(总页数),利用循环和判断,将15行内容分别存放想数组变量中,然后在分页时读取数组数据即可。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)