首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何以编程方式在ASP.NET 4.0 GridView上启用分页和排序?

如何以编程方式在ASP.NET 4.0 GridView上启用分页和排序?
EN

Stack Overflow用户
提问于 2010-11-03 16:57:25
回答 3查看 96.2K关注 0票数 21

我使用的是带有C#的ASP.NET 4.0 (Visual Web Developer2010Express)。

我已经成功地使用声明性ASP.NET代码实现了一个绑定到存储过程数据源的简单GridView,如下所示:

代码语言:javascript
复制
<asp:GridView 
    ID="grdTrades" 
    runat="server" 
    DataKeyNames="tradeId" 
    EnablePersistedSelection="true"
    SelectedRowStyle-BackColor="Yellow" 
    AllowPaging="true" 
    AllowSorting="true"
    PageSize = "20" 
    AutoGenerateColumns="false" 
    DataSourceID="sdsTrades" 
    >
    <Columns>
        <asp:CommandField ShowSelectButton="true" ButtonType="Link" SelectText="Select" />
        <asp:BoundField DataField="tradeId" HeaderText="TradeId"  ReadOnly="True" SortExpression="tradeId" />
        < ... more columns ... >
    </Columns>
</asp:GridView>

<asp:SqlDataSource ID="sdsTrades" runat="server" 
    ConnectionString="<%$ ConnectionStrings:TradesDB %>" 
    ProviderName="<%$ ConnectionStrings:Trades.ProviderName %>"  
    SelectCommand="usp_GetTrades" SelectCommandType="StoredProcedure">      
</asp:SqlDataSource>

它工作得很好,包括分页和排序。我想删除SqlDataSource并使用代码隐藏(我试图将数据库访问代码放在一个地方)。到目前为止,我在我的代码隐藏中有以下内容:

代码语言:javascript
复制
protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack)
    {
        grdTrades.SelectedIndex = 0;
        DBUtil DB = new DBUtil();
        grdTrades.DataSource = DB.GetTrades();
        grdTrades.DataKeyNames = new string[] { "tradeId" };
        grdTrades.DataBind();            
    }
}

// this is needed otherwise I get "The GridView 'grdTrades' fired event PageIndexChanging which wasn't handled."
void grdTrades_PageIndexChanging(Object sender, GridViewPageEventArgs e)
{
    grdTrades.PageIndex = e.NewPageIndex;
    grdTrades.DataBind();
}    

我的声明性代码现在看起来像这样:

代码语言:javascript
复制
<asp:GridView 
    ID="grdTrades" 
    runat="server" 
    EnablePersistedSelection="true"            
    SelectedRowStyle-BackColor="Yellow" 
    AllowPaging="true" 
    AllowSorting="true"
    PageSize = "20" 
    AutoGenerateColumns="false" 

    OnPageIndexChanging="grdTrades_PageIndexChanging"
    >
    <Columns>
        <asp:CommandField ShowSelectButton="true" ButtonType="Link" SelectText="Select" />
        <asp:BoundField DataField="tradeId" HeaderText="TradeId"  ReadOnly="True" SortExpression="tradeId" />
        < ... more columns ... >           
    </Columns>
</asp:GridView>

问题是当我点击一个页码时,页面变成了空白。我也想实现排序,但希望首先让分页工作。请帮帮忙。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-03 21:49:48

您需要在每次更改页面时绑定您的GridView。

例如:

代码语言:javascript
复制
void grdTrades_PageIndexChanging(Object sender, GridViewPageEventArgs e) 
{
    grdTrades.DataSource = DB.GetTrades();  
    grdTrades.PageIndex = e.NewPageIndex; 
    grdTrades.DataBind(); 
} 

我的建议是将来自DB.GetTrades()的结果存储在ViewState (或缓存)中,这样您就不必在每次更改页面时都去数据库。

不过,在执行此操作时,排序可能会变得相当困难。

您可以始终使用ObjectDataSource而不是SqlDatasource。然后,您可以指向ObjectDataSource来查看您的DB.GetTrades()函数。排序和分页将自动工作。

希望这能有所帮助。

票数 30
EN

Stack Overflow用户

发布于 2013-02-18 17:23:50

您可以创建一个方法来绑定网格视图,而不是在分页中再次绑定它。通过创建绑定网格视图的方法,您可以随时调用该方法来绑定网格视图。

代码语言:javascript
复制
protected void Page_Load(object sender, EventArgs e)
{
   if (!this.IsPostBack)
   {
       BindgrdTrades();            
   }
private void BindgrdTrades()
   {
      DBUtil DB = new DBUtil();
       grdTrades.DataSource = DB.GetTrades();
       grdTrades.DataKeyNames = new string[] { "tradeId" };
       grdTrades.DataBind(); 
   }
}

void grdTrades_PageIndexChanging(Object sender, GridViewPageEventArgs e) 
   {

       grdTrades.PageIndex = e.NewPageIndex; 
       BindgrdTrades(); 
   } 
}
票数 3
EN

Stack Overflow用户

发布于 2014-02-06 05:56:08

我不得不向公众公开我的_PageIndexChanging (我是asp.net的新手,我不知道这有什么关系)。页面会通过一个错误来说明它找不到这个类。这些帖子对使用接近逐字逻辑的分页非常有帮助。感谢所有的海报花时间把它展示得如此清晰。下面是我最后使用的代码:

代码语言:javascript
复制
public partial class Requests : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        if (!this.IsPostBack)
        {
            BindgrdBuilds();

        }
    }

    private void BindgrdBuilds()
    {
        // Link GridView to datasource
        GridView1.DataSource = BuildData.getBuilddata();

        // Bind SQLDataSource to GridView after retrieving the records.
        GridView1.DataBind();

    }

    public void GridView1_PageIndexChanging(Object sender, GridViewPageEventArgs e)
    {
        // increment PageIndex
        GridView1.PageIndex = e.NewPageIndex;

        // bind table again
        BindgrdBuilds();

    } 
}

我坚持使用AutoGenerated列,并对cs页面上的数据进行了一些行绑定,但上面没有包含这些行,但下面是我的GridView代码:

代码语言:javascript
复制
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<asp:GridView ID="GridView1" 
    OnRowDataBound="GridView1_RowDataBound" 
    OnPageIndexChanging="GridView1_PageIndexChanging"
    runat="server" 
    SelectedRowStyle-BackColor="Yellow" 
    AllowPaging="true" 
    AllowSorting="true"
    PageSize = "20" 
    AutoGenerateColumns="true" 
    <-- table formatting code trimmed -->
</asp:GridView>

我希望其他人可以利用这个信息,这个帖子是一个很好的,简单的例子。现在分页起作用了,是时候来点真正的花样了,为GridView1想出一个新名字:D

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4085410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档