Asp.net C# 列表视图分页 无法加载视图状态



我在列表视图上使用数据寻呼器进行分页时遇到了一些问题。该页面非常简单。输入搜索文本。点击搜索按钮。将结果显示到列表视图。结果显示正常,但每次我单击页码时,我都会收到以下错误:

Server Error in '/' Application.
Failed to load viewstate.  The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request.  For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: System.Web.HttpException: Failed to load viewstate.  The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request.  For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
Source Error: 
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace: 

[HttpException (0x80004005): Failed to load viewstate.  The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request.  For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.]
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +317
   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +144
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +204
   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +144
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +204
   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +144
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +204
   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +144
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +204
   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +144
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +204
   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +144
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +204
   System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +144
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +204
   System.Web.UI.Page.LoadAllState() +464
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1849
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34212 

这是我的妆容:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Search.aspx.cs" Inherits="ITDB.Views.Employee.Search"%>
<asp:Content ID="Content1" ContentPlaceHolderID="Header" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <br />
    <asp:TextBox ID="SearchText" runat="server"></asp:TextBox>
    <asp:Button ID="cmdSearch" runat="server" Text="Search" OnClick="cmdSearch_Click" />
    <hr />
    <asp:ListView id="SearchList" runat="server"
            DataKeyNames="EmployeeID" 
            ItemType="ITDB.DBContext.Employee"      
            >
            <EmptyDataTemplate>
                There are no entries found for Employee
            </EmptyDataTemplate>
            <LayoutTemplate>                                                       
                <asp:PlaceHolder runat="server" id="itemPlaceholder" />
               <asp:DataPager PageSize="5"  runat="server">
                    <Fields>
                        <asp:NextPreviousPagerField ShowLastPageButton="False" ShowNextPageButton="False" ButtonType="Button" ButtonCssClass="btn" />
                        <asp:NumericPagerField ButtonType="Button"  NumericButtonCssClass="btn" CurrentPageLabelCssClass="btn disabled" NextPreviousButtonCssClass="btn" />
                        <asp:NextPreviousPagerField ShowFirstPageButton="False" ShowPreviousPageButton="False" ButtonType="Button" ButtonCssClass="btn" />
                    </Fields>
                </asp:DataPager>                
            </LayoutTemplate>
            <ItemTemplate>
                <%#: Item.FirstName + " " + Item.LastName%>
                <br />   
            </ItemTemplate>
    </asp:ListView>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="AfterForm" runat="server">
</asp:Content>

代码隐藏:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.Entity;
using ITDB.DBContext;
namespace ITDB.Views.Employee
{
    public partial class Search : System.Web.UI.Page
    {
        protected ITDB.DBContext.ITDB_MSSQL_Connection _db = new ITDB.DBContext.ITDB_MSSQL_Connection();
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        protected void cmdSearch_Click(object sender, EventArgs e)
        {
            String szSearch = SearchText.Text;
            SearchList.DataSource = GetSearchList(szSearch);
            SearchList.DataBind();
        }
        private List<ITDB.DBContext.Employee> GetSearchList(String searchString)
        {
            return (from employee in _db.Employee
                    where employee.FirstName.Contains(searchString) ||
                          employee.LastName.Contains(searchString)
                    orderby employee.LastName
                    select employee
                        ).ToList();
        }
    }
}

我在这里做错了什么?非常感谢任何帮助。

这里有一个很好的答案,因为直到运行时才知道字段。

http://blog.yeshere.org/2011/04/using-datapager-in-listview.html

将数据寻呼机的 ID 设置为:数据寻呼机1

您应该添加并实现 ListView 的 PagePropertiesChanging 事件。事件参数中的 PagePropertiesChangingEventArgs 将提供所有需要的分页属性(StartRowIndex 和 MaximumRows),以便您可以将它们提供给 DataPager。

如果数据寻呼器放置在列表视图中,就像您的一样,执行以下操作:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e) {
  ListView lv = sender as ListView;
  DataPager pager = lv.FindControl("DataPager1") as DataPager;
  pager.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
  BindData();  // set DataSource to ListView and call DataBind() of ListView
}

如果在外面:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e) {     
      this.DataPage1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
      BindData();  // set DataSource to ListView and call DataBind() of ListView
    }

最新更新