Как включить подкачку и сортировку в ASP.NET 4.0 GridView программным способом? - PullRequest
20 голосов
/ 03 ноября 2010

Я использую ASP.NET 4.0 с C # (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>

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

Спасибо

Ответы [ 3 ]

29 голосов
/ 03 ноября 2010

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

Например:

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() функцию. Сортировка и подкачка будут работать автоматически.

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

2 голосов
/ 18 февраля 2013

Вы можете создать метод для привязки вида сетки вместо повторной привязки в 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(); 
   } 
}
1 голос
/ 06 февраля 2014

Мне пришлось сделать мой счетчик _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, которую я не включил выше, но вот мой аспкод для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...