我做的类似与一个论坛的东西。获取帖子并分页。
两个方案,该用那个或者还有什么其他方法?
方案一:我声明了一个Pages.它是一个集合,每个元素都是一个(Page类型)代表一个帖子,每个帖子(Page)都有title,text属性。我写了一个存储过程,每次获取20条帖子并添加到Pages中,并将Pages绑定到GridView中,并另外添加了按钮“下一页”(每次点击都要再调用存储过程获取20条记录,将新的帖子覆盖Pages对象中原来的帖子)。
方案二:直接用数据源绑控件绑定定GridView。
这两种那种好?首先考虑性能。
或者还有其他什么方法?我要实现分页功能。说说原理就可以,不需要源代码。谢谢各位
------解决方案--------------------------------------------------------
肯定是上者好,对于大数据量来说,都应该是用多少取多少。
------解决方案--------------------------------------------------------
我是用下面的方法,调用这个方法想得到第几页的内容都行,再重新和数据控件绑定就可以:
public override List<Message> GetMessage(int pageIndex, int pageSize, out int totalRecords)
{
if (pageIndex < 0)
throw new ArgumentException("PageIndex cannot be negative");
if (pageSize < 1)
throw new ArgumentException("PageSize must be positive");
long lBound = (long)pageIndex * pageSize;
long uBound = lBound + pageSize - 1;
if (uBound > System.Int32.MaxValue)
{
throw new ArgumentException("PageIndex too big");
}
List<Message> messageCollection = new List<Message>();
AccessConnectionHolder holder = AccessHelper.GetConnection(_databaseFileName, true);
OleDbConnection connection = holder.Connection;
OleDbDataReader reader = null;
long recordCount = 0;
try
{
try
{
OleDbCommand command = new OleDbCommand(@"SELECT Id,Writer,Face,Title,Content,WriteDate,Reply,ReplyDate " +
@"FROM aspnet_Guestbook ORDER BY Id DESC",
connection);
reader = command.ExecuteReader(CommandBehavior.SequentialAccess);
while (reader.Read())
{
recordCount++;
if (recordCount - 1 < lBound || recordCount - 1 > uBound)
continue;
Message m = new Message(reader.GetInt32(0), reader.GetString(1), reader.GetString(2), reader.GetString(3), reader.GetString(4), reader.GetDateTime(5), reader.GetString(6), reader.GetDateTime(7));
messageCollection.Add(m);
}
totalRecords = (int)recordCount;
return messageCollection;
}
catch (Exception e)
{
throw AccessHelper.GetBetterException(e, holder);
}
finally
{
if (reader != null)
reader.Close();
holder.Close();
}
}
catch
{
throw;
}
}