【问题标题】:Event problem inside grid view with custom paging带有自定义分页的网格视图内的事件问题
【发布时间】:2011-11-19 10:25:21
【问题描述】:

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

 <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>

如果我在这里创建按钮并绑定点击事件,那么它会被触发,但问题是每个与网格绑定的行都会发生此事件

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 类型的变量,所以我使用它然后我必须在每次分页时调用这个方法,我不想使用 对象数据源.

【问题讨论】:

    标签: asp.net


    【解决方案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;
      

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2011-01-12
      • 2017-05-05
      相关资源
      最近更新 更多