网格视图中的事件问题与自定义分页

时间:2011-09-17 20:40:05

标签: asp.net

我想在网格视图中提供自定义分页。

 <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

1 个答案:

答案 0 :(得分:1)

  1. GridView的RowCreated确实将在GridView中的每一行调用,因为这是GridView将(重新)创建GridViewRows的事件。但是如果你检查if (e.Row.RowType == DataControlRowType.Pager),就没有开销。此事件非常适合创建动态控件,因为它甚至在回发时调用(与RowDataBound相反)。所以你的第一种方式应该是正确的。
  2. 如果您希望在少于PageSize行时显示寻呼机,则应强制寻呼机为visible,例如在GridView的覆盖OnPreRender中。

    GridViewRow pagerRow = (GridViewRow) this.BottomPagerRow;    
    if(pagerRow != null) pagerRow.Visible = true;