Можно ли включить разбиение на страницы / сортировку для GridView, который связан с данными в коде позади? - PullRequest
0 голосов
/ 01 сентября 2011

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

Я пытался:

[ASPX]

<asp:Button runat="server" OnClick="ItemsSearch" Text="Search" />
<asp:GridView runat="server" ID="ItemsGV"
    AllowPaging="true" AllowSorting="true" PageSize="4" />

[отделенного кода]

protected void ItemsSearch(object sender, EventArgs e)
{
    DataSet Items = new DataSet();
    Items.ReadXml(MapPath("Items.xml"));
    Session["items"] = Items;
    ItemsGV.DataSource = Session["items"];
    ItemsGV.DataBind();
}

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

Есть идеи, как заставить этот вид связывания работать?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2011

После изучения некоторых учебных пособий я получил следующее решение:

[Default.aspx]

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TemplateGridViewNoDataSourcePagingSorting.Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
  <title></title>
</head>
<body>
  <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" />
    <asp:Button ID="Button1" runat="server" OnClick="ItemsSearch" Text="Search" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
      <ContentTemplate>
        <asp:GridView runat="server" ID="ItemsGV" Visible="false" 
          AllowPaging="true" AllowSorting="true" PageSize="4"
          OnPageIndexChanging="ItemsGV_PageIndexChanging" OnSorting="ItemsGV_Sorting">
        </asp:GridView>
      </ContentTemplate>
    </asp:UpdatePanel>
  </form>
</body>
</html>

[Default.aspx.cs]

using System;
using System.Data;
using System.Threading;
using System.Web.UI.WebControls;

namespace TemplateGridViewNoDataSourcePagingSorting
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Thread.Sleep(3000); // simulate long response time
                var ItemsDataSet = new DataSet();
                ItemsDataSet.ReadXml(MapPath("Items.xml"));
                Session["items"] = ItemsDataSet.Tables[0];
                ViewState["sortingOrder"] = string.Empty;
            }
        }

        protected void ItemsGV_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            ItemsGV.PageIndex = e.NewPageIndex;
            ItemsGV.DataSource = Session["items"];
            ItemsGV.DataBind();
        }

        protected void ItemsSearch(object sender, EventArgs e)
        {
            ItemsGV.Visible = true;
            DataBindGrid("", "");
        }

        private void DataBindGrid(string sortExpr, string sortOrder)
        {
            // if sorting expression had changed
            // set sort order to ascending
            if (sortExpr != (string)ViewState["sortingExpression"])
            {
                sortOrder = "asc";
                ViewState["sortingOrder"] = "asc";
            }
            ViewState["sortingExpression"] = sortExpr;

            var dt = Session["items"] as DataTable;
            if (dt != null)
            {
                DataView dv = dt.DefaultView;
                if (sortExpr != string.Empty)
                    dv.Sort = sortExpr + " " + sortOrder;
                ItemsGV.DataSource = dv;
                ItemsGV.DataBind();
            }
            else
            {
                ItemsGV.DataSource = null;
                ItemsGV.DataBind();
            }
        }

        protected void ItemsGV_Sorting(object sender, GridViewSortEventArgs e)
        {
            DataBindGrid(e.SortExpression, sortingOrder);
        }

        public string sortingOrder
        {
            get
            {
                if (ViewState["sortingOrder"].ToString() == "desc")
                    ViewState["sortingOrder"] = "asc";
                else
                    ViewState["sortingOrder"] = "desc";
                return ViewState["sortingOrder"].ToString();
            }
            set
            {
                ViewState["sortingOrder"] = value;
            }
        }
    }
}

[Items.xml]

<?xml version="1.0" encoding="utf-8" ?>
<Items>
  <Item>
    <ItemName>Item01</ItemName>
    <ItemDescription>Item01 Description</ItemDescription>
    <ItemPrice>2.50</ItemPrice>
    <ItemInStock>Y</ItemInStock>
  </Item>
  <Item>
    <ItemName>Item02</ItemName>
    <ItemDescription>Item02 Description</ItemDescription>
    <ItemPrice>1.50</ItemPrice>
    <ItemInStock>Y</ItemInStock>
  </Item>
  <Item>
    <ItemName>Item03</ItemName>
    <ItemDescription>Item03 Description</ItemDescription>
    <ItemPrice>3.50</ItemPrice>
    <ItemInStock>N</ItemInStock>
  </Item>
  <Item>
    <ItemName>Item04</ItemName>
    <ItemDescription>Item04 Description</ItemDescription>
    <ItemPrice>5.00</ItemPrice>
    <ItemInStock>Y</ItemInStock>
  </Item>
  <Item>
    <ItemName>Item05</ItemName>
    <ItemDescription>Item05 Description</ItemDescription>
    <ItemPrice>5.50</ItemPrice>
    <ItemInStock>N</ItemInStock>
  </Item>
  <Item>
    <ItemName>Item06</ItemName>
    <ItemDescription>Item06 Description</ItemDescription>
    <ItemPrice>4.50</ItemPrice>
    <ItemInStock>N</ItemInStock>
  </Item>
  <Item>
    <ItemName>Item07</ItemName>
    <ItemDescription>Item07 Description</ItemDescription>
    <ItemPrice>1.50</ItemPrice>
    <ItemInStock>Y</ItemInStock>
  </Item>
  <Item>
    <ItemName>Item08</ItemName>
    <ItemDescription>Item08 Description</ItemDescription>
    <ItemPrice>7.50</ItemPrice>
    <ItemInStock>Y</ItemInStock>
  </Item>
  <Item>
    <ItemName>Item09</ItemName>
    <ItemDescription>Item09 Description</ItemDescription>
    <ItemPrice>0.50</ItemPrice>
    <ItemInStock>N</ItemInStock>
  </Item>
  <Item>
    <ItemName>Item10</ItemName>
    <ItemDescription>Item10 Description</ItemDescription>
    <ItemPrice>3.50</ItemPrice>
    <ItemInStock>Y</ItemInStock>
  </Item>
</Items>
0 голосов
/ 01 сентября 2011

Вы должны добавить обработчики событий, когда люди нажимают на эти кнопки.

Представьте себе, что при первой загрузке страницы все необходимые данные попадают в GridView. ASP.NET понимает, что вы можете отображать только элементы X на первой странице, поэтому загружает их в элемент управления и отправляет их клиенту. Теперь пользователь хочет видеть элементы страницы 2. Когда они делают этот запрос, он попадает на сервер, но сервер потерял все ссылки на страницу 2. Он не знает, что должен показать.

Вам нужно обработать события и указать, что показывать. Это будет означать привязку к данным и отображение информации на странице 2.

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