是否可以使用下一步和上一页进行自定义分页,以及Repeater
之间的页码(如GridView
)?我找到了一些东西,但它仅适用于10页。
我想要的是像谷歌那样的分页:
< 1 2 3 4 ... 15 >
我发现扩展Repeater
让我使用DataPager,在此解释:CodeProject: Extend Repeater to support DataPager
但是当我使用SqlDataReader
作为DataSource
时,我遇到了这个错误:
Type 'System.Data.SqlClient.SqlDataReader' in Assembly
'System.Data, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089' is not marked as serializable.
这是我的代码:
public bool ListBooksByCat(DataPagerRepeater.DataPagerRepeater repeater)
{
List<string> selection = new List<string>();
Dictionary<string, object> clause = new Dictionary<string, object>();
clause.Add("IsValid", true);
SqlDB myDb = new SqlDB(this.Connection);
try
{
SqlDataReader reader = myDb.Retrive(this.TableName, selection, clause, "bookid", true);
repeater.DataSource = reader;
repeater.DataBind();
reader.Close();
return true;
}
catch (Exception e)
{
//logging errors
return false;
}
}
Note
:DataPagerRepeater.DataPagerRepeater内置链接文章。
答案 0 :(得分:0)
您应该将控件绑定到DataTable或其他一些使数据脱机的集合(DataReader在绑定期间始终保持连接模式),而不是绑定到SqlReader。您收到此错误是因为SqlDataReader是与资源相关的对象,并且任何与资源无关的对象都无法“传递”到客户端。
答案 1 :(得分:0)
我将SqlDataReader
复制到DataTable
,然后将转发器绑定到它:
SqlDataReader reader = myDb.Retrive(this.TableName, selection, clause, "bookid", true);
DataTable dt = new DataTable();
dt.Load(reader);
reader.Close();
repeater.DataSource = dt;
repeater.DataBind();