我想在网格视图中提供自定义分页。
<asp:GridView ID="gvFirst" runat="server" AutoGenerateColumns="false"
AllowPaging="true"
ondatabound="gvFirst_DataBound" >
<Columns>
<asp:BoundField DataField="ID" HeaderText="ProductID"/>
<asp:BoundField DataField="Name" HeaderText="ProductName" />
</Columns>
<PagerTemplate>
<asp:Panel ID="pnlPager" runat="server">
</asp:Panel>
</PagerTemplate>
</asp:GridView>
如果我在这里创建按钮并绑定click事件则会触发,但问题是每个行绑定网格都会发生此事件
protected void gvFirst_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Pager)
{
Panel pnPager = e.Row.FindControl("pnlPager") as Panel;
if (pnPager != null)
{
Button btnFirst = new Button();
btnFirst.Text = "1";
btnFirst.Click += new EventHandler(btnFirst_Click);
pnPager.Controls.Add(btnFirst);
}
}
}
如果我在这里创建按钮并绑定点击事件,那么它就不是火;所有行绑定到网格后此事件触发,因此它只会发生一次。
protected void gvFirst_DataBound(object sender, EventArgs e)
{
GridViewRow gvRow = gvFirst.BottomPagerRow;
if (gvRow != null)
{
Panel pnPager = gvRow.FindControl("pnlPager") as Panel;
if (pnPager != null)
{
Button btnFirst = new Button();
btnFirst.Text = "1";
btnFirst.Click += new EventHandler(btnFirst_Click);
pnPager.Controls.Add(btnFirst);
}
}
}
void btnFirst_Click(object sender, EventArgs e)
{
using (_NorthWindDataContext = new NorthWindDataContext())
{
var ProductInformation = from p in _NorthWindDataContext.Products
select new
{
ID = p.ProductID,
Name = p.ProductName
};
gvFirst.DataSource = ProductInformation.Skip(5).Take(5);
gvFirst.DataBind();
}
}
我面临的另一个问题是我想提供自定义分页。现在我已将页面大小设置为5,我从查询中获取5条记录,因此我的网格寻呼机不会显示。
public class Productinformation
{
public int PID
{
get;
set;
}
public string PName
{
get;
set;
}
}
using (NorthWindDataContext _NorthWindDataContext = new NorthWindDataContext())
{
Proinfo = new List<Productinformation>();
Proinfo = (from p in _NorthWindDataContext.Products
select new Productinformation
{
PID = p.ProductID,
PName = p.ProductName,
}).ToList();
gvFirst.DataSource = Proinfo.Take(PageSize) ;
gvFirst.DataBind();
}
Proinfo变量全局声明。
现在当我绑定我运行此代码时,它会给我错误数据源不支持服务器端数据分页。如果我使用var类型的变量然后它工作但我们不能全局声明var类型的变量,所以我使用它然后我必须每次在分页中调用此方法,我不想使用的ObjectDataSource
答案 0 :(得分:1)
if (e.Row.RowType == DataControlRowType.Pager)
,就没有开销。此事件非常适合创建动态控件,因为它甚至在回发时调用(与RowDataBound相反)。所以你的第一种方式应该是正确的。如果您希望在少于PageSize行时显示寻呼机,则应强制寻呼机为visible,例如在GridView的覆盖OnPreRender中。
GridViewRow pagerRow = (GridViewRow) this.BottomPagerRow;
if(pagerRow != null) pagerRow.Visible = true;