Подтвердить что ты не робот

Как включить пейджинг и сортировку в ASP.NET 4.0 GridView программно?

Я использую ASP.NET 4.0 с С# (Visual Web Developer 2010 Express).

Мне удалось реализовать простую привязку GridView к источнику данных хранимой процедуры, используя декларативный код ASP.NET, как показано ниже:

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

Проблема заключается в том, когда я нажимаю на номер страницы, страница становится пустой. Я также хотел бы выполнить сортировку, но хотел бы сначала запустить пейджинг. Пожалуйста, помогите.

Спасибо

4b9b3361

Ответ 1

Вам нужно привязывать GridView каждый раз, когда вы меняете страницу.

Например:

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

Мой совет будет хранить ваши результаты от DB.GetTrades() в ViewState (или Cache), поэтому вам не нужно обращаться к базе данных каждый раз, когда вы меняете страницу.

Сортировка может стать довольно сложной при этом.

Вы всегда можете использовать объект ObjectDataSource вместо SqlDatasource. Затем вы можете указать свой объект ObjectDataSource для просмотра вашей функции DB.GetTrades(). Сортировка и пейджинг будут работать автоматически.

Надеюсь, что это поможет.

Ответ 2

Вы можете создать метод привязки вида сетки вместо привязки его снова в пейджинге. Создавая метод, который связывает Grid View, вы всегда можете вызвать метод для привязки представления сетки всякий раз, когда захотите.

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

Мне пришлось сделать свой счетчик _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();

    } 
}

Я застрял с автогенерированными столбцами, и я выполняю привязку строки к моим данным на странице cs, которую я не включил выше, но вот мой код asp для GridView:

<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