关于MySQLDriverCS的一个问题

Rance 2009-08-13 09:51:54
我在一个窗体上放了一个ListView控件,用来显示对一个数据库进行SQL查询得到的结果,这个查询时通过利用MySQLDriverCS来进行的
问题是:
如果得到的结果行数很大,那么ListView控件更新的时间就很长,给用户的感觉就很不舒服
于是,我决定,每次只显示固定数目行, 比如, 50行
然后通过旁边的按钮,由用户决定要不要继续往下看.
问题是, 如果用户想往上翻的话,要怎么实现呢? 难道我一定要重新进行一次SQL查询,然后read到需要显示的那一行才开始更新ListView吗?

不晓得我给大家讲明白了没...
下面是相关部分代码:

//以下两行用来清空ListView的所有内容
listView1.Items.Clear();
listView1.Columns.Clear();

// 添加headers
for (int i = 0; i < GlobalData.DBReader.FieldCount; i++)
{
if (i < 2)
{
listView1.Columns.Add(GlobalData.DBReader.GetName(i), GlobalData.DBReader.GetName(i).Length * 9 + 10, HorizontalAlignment.Left);
}
else
{
listView1.Columns.Add(GlobalData.DBReader.GetName(i), GlobalData.DBReader.GetName(i).Length * 8 + 10, HorizontalAlignment.Right);
}
}

// 关键代码段: 添加查询到的结果
while (GlobalData.DBReader.Read())
{
ListViewItem lvi;
string[] stemp = new string[50];
for(int i=0; i<GlobalData.DBReader.FieldCount; i++)
{
stemp[i] = GlobalData.DBReader.GetString(i);
listView1.Columns[i].Width = (listView1.Columns[i].Width > stemp[i].Length * 10 + 10) ? listView1.Columns[i].Width : stemp[i].Length * 9 + 10;
}

lvi = new ListViewItem(stemp);
listView1.Items.Add(lvi);

}


为了把问题说的更清楚些, 我写下伪码吧:

while (DBReader读一行)
{
创建一个ListViewItem对象;
用DBReader读到的一行数据去为ListView赋值;
将该ListViewItem对象添加到ListView控件中;
}

上述这种做法是逐次读一行, 往ListView控件上添加一行, 直到全部行都处理完
我要做的是, 逐次读一行, 往ListView控件上添加一行, 直到当前页应该显示的50行都处理完.
问题是, 这样可以很方便的往下一页,翻 也就是继续读下面的50行并显示
但是, 如何往上一页翻呢? 也就是读当前显示的行前面的50行并显示
...全文
183 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouyanfss 2009-08-27
  • 打赏
  • 举报
回复
你不要用dataReader,用dataset
MYSQL有个limit语法,就是取多少条至多少条的数据,如limit 100,200
所以你页面分页用limit pagesize*(pagenumber-1),pagesize*pagenumber就可以了
Rance 2009-08-17
  • 打赏
  • 举报
回复
我是直接拿C#来写WinForm程序的, 我没学过C#....
能讲讲Dictionary是什么,怎么用吗?
非常感谢!
cppfaq 2009-08-13
  • 打赏
  • 举报
回复
建立一个Dictionary<T,S>用于缓存已经读过的数据

110,537

社区成员

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

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

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