簡體   English   中英

如何以編程方式在ASP.NET 4.0 GridView上啟用分頁和排序?

[英]How to enable Paging and Sorting on ASP.NET 4.0 GridView programmatically?

我使用ASP.NET 4.0與C#(Visual Web Developer 2010 Express)。

我已成功設法使用聲明性ASP.NET代碼實現綁定到存儲過程數據源的簡單GridView,如下所示:

<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並使用代碼隱藏(我試圖將數據庫訪問代碼放在一個地方)。 到目前為止,我在我的代碼隱藏中有這個:

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();
}    

我的聲明代碼現在看起來像:

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

問題是,當我點擊頁碼時,頁面變為空白。 我還想實現排序,但希望首先使分頁工作。 請幫忙。

謝謝

每次更改頁面時都需要綁定GridView。

例如:

void grdTrades_PageIndexChanging(Object sender, GridViewPageEventArgs e) 
{
    grdTrades.DataSource = DB.GetTrades();  
    grdTrades.PageIndex = e.NewPageIndex; 
    grdTrades.DataBind(); 
} 

我的建議是將結果存儲在ViewState(或Cache DB.GetTrades()中的DB.GetTrades()中,這樣每次更改頁面時都不需要轉到數據庫。

但是,在執行此操作時,排序會變得非常困難。

您始終可以使用ObjectDataSource而不是SqlDatasource。 然后,您可以指向ObjectDataSource以查看DB.GetTrades()函數。 排序和分頁將自動運行。

希望有所幫助。

您可以創建一種方法來綁定網格視圖,而不是在Paging中再次綁定它。 通過創建綁定網格視圖的方法,您始終可以調用方法以隨時綁定網格視圖。

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(); 
   } 
}

我不得不將我的_PageIndexChanging計數器公開(我在asp.net上這么新,我不知道為什么這很重要)。 該頁面將通過一個錯誤說它無法找到該類。 這些帖子對於使用其他接近逐字邏輯的分頁工作有很大幫助。 感謝所有海報花時間如此清晰地展示出來。 這是我最終得到的代碼:

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的asp代碼:

<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找到一個新名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM