是否有可能启用在代码隐藏中绑定的GridView的分页/排序?

本文关键字:GridView 分页 排序 绑定 启用 有可能 代码 隐藏 是否 | 更新日期: 2023-09-27 18:07:19

我知道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加载了数据,但如果我点击排序或更改页面,什么都不会发生。

你知道如何使这种绑定工作吗?

是否有可能启用在代码隐藏中绑定的GridView的分页/排序?

当人们点击这些按钮时,你必须添加事件处理程序。

想象一下:当你第一次加载页面时,你想要的所有数据都进入GridView。ASP。NET意识到您只能在第一页上显示X项,因此它将其加载到控件中并将其发送到客户端。现在,用户想要查看第2页的项目。当他们发出这个请求时,它到达服务器,但是服务器已经丢失了对第2页的所有引用。它不知道该显示什么。

你需要处理事件并告诉它显示什么。这将意味着重新绑定到数据并显示第2页的信息。

在学习了一些教程后,我最终得到了这个解决方案:

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