web-dev-qa-db-ja.com

ASP.NET 4.0 GridViewでページングと並べ替えをプログラムで有効にする方法

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を削除してコードビハインドを使用したい(データベースアクセスコードを1か所に配置しようとしています)。これまでのところ、私はコードビハインドでこれを持っています:

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>

問題は、ページ番号をクリックすると、ページが空白になることです。並べ替えも実装したいのですが、ページングを最初に機能させたいと思います。助けてください。

ありがとう

20
Mark Allison

ページを変更するたびにGridViewをバインドする必要があります。

例えば:

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

私のアドバイスは、DB.GetTrades()からの結果をViewState(またはキャッシュ)に保存して、ページを変更するたびにデータベースにアクセスする必要がないようにすることです。

ただし、これを行うとソートが非常に難しくなる可能性があります。

SqlDatasourceの代わりにObjectDataSourceを常に使用できます。次に、ObjectDataSourceをポイントして、DB.GetTrades()関数を参照します。並べ替えとページングは​​自動的に機能します。

お役に立てば幸いです。

29
Jamie

ページングで再度バインドする代わりに、グリッドビューをバインドするためのメソッドを作成できます。グリッドビューをバインドするメソッドを作成すると、いつでもメソッドを呼び出して、いつでもグリッドビューをバインドできます。

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

_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

1
brendan62269