创建了一个服务器控件,在帮定数据的时候,每页显示10行,当翻页翻到最后一页,比如只有7条,再往前翻,出现以下错误(大致意思是控件数要保持和以前要求的在viewstate中保持的控件数一致,因为我这里控件数减少了,所以就...)。但是如果数据能被10整除,当翻页翻到最后一页,再往前翻,没有这种现象。
希望有经验的兄弟帮帮忙,先谢谢了!!!!!
例外の詳細: System.Web.HttpException: ViewState の読み込みに失敗しました。ViewState が読み込まれているコントロールのツリーは、前の要求で ViewState の保存に使用されたコントロールのツリーと一致しなければなりません。たとえば、コントロールを動的に追加する時、ポストバック 中に追加されたコントロールは、最初の要求中に追加されたコントロールの型と位置に一致しなければなりません。ソース エラー: 現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の例外スタック トレースを使って確認できます。  スタック トレース: 
[HttpException (0x80004005): ViewState の読み込みに失敗しました。ViewState が読み込まれているコントロールのツリーは、前の要求で ViewState の保存に使用されたコントロールのツリーと一致しなければなりません。たとえば、コントロールを動的に追加する時、ポストバック 中に追加されたコントロールは、最初の要求中に追加されたコントロールの型と位置に一致しなければなりません。]
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   System.Web.UI.Page.LoadPageViewState()
   System.Web.UI.Page.ProcessRequestMain() 

解决方案 »

  1.   

    using System;
    using System.Data;
    using System.Data.OleDb;
    using System.Web.UI.Design;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Drawing.Design;
    using System.ComponentModel;
    using System.Collections;
    namespace ServerControls
    { [ParseChildren(true), 
    PersistChildren(false), 
    Description("SuperDataGrid."), 
    Designer("ServerControls.SuperDataGridDesigner"), 
    ToolboxData("<{0}:SuperDataGrid runat=server></{0}:SuperDataGrid>")]
    public class SuperDataGrid:System.Web.UI.WebControls.DataList, INamingContainer {

    protected const string HTML1 = "<table><tr><td width=150>";
    protected const string HTML2  = "</td><td width=50>";
    protected const string HTML3  = "</td><td width=20></td><td width=50>";
    protected const string HTML4  = "</td><td width=20></td><td width=150>";
    protected const string HTML5  = "ページへ</td></tr></table>";
    protected const string HTML_SEPERATOR = "<br/>"; private const string KEY_CURRENT_PAGE_DATA_SOURCE  = "CurrentPageDataSource";
    private const string KEY_ITEM_COUNT  = "ItemCount";
    private const string KEY_CURRENT_PAGE_INDEX  = "CurrentPageIndex";
    private const string KEY_PAGE_SIZE  = "PageSize"; private const string IMG_PREV  = "Image/parts_top_back.gif";
    private const string IMG_MORE  = "Image/parts_top_next.gif"; private const string KEY_PAGE = "page"; private ImageButton btnPrev;  
    private ImageButton btnMore ; private DropDownList ddlJumpUp;
    private DropDownList ddlJumpDown; private const string KEY_MODE= "Mode";
    protected string _emptyText;
    private IList _OriginalDataSource;
    private bool _SetEditStatus = true;

    private string _DataSourceName;
    private string _UserPassword;
    private string _UserID;
    private string _SelectSQL; [Browsable(true),
    Category("Behavior"),
    Description("Controls whether existing record are edited, or created.")]
    public ModeType Mode
    {
    get
    {
    return (ModeType)ViewState[KEY_MODE];
    }
    set
    {
    ViewState[KEY_MODE] = value;

    if ((value == ModeType.Insert) && (Visible == false))
    {
    Visible = true;
    DataBind();
    }   
    }
    } public  bool SetEditStatus
    {
    get
    {
    return _SetEditStatus;
    }
    set
    {
    _SetEditStatus = value;
    }
    } public  object OriginalDataSource
    {
    set
    {
    try
    {
    _OriginalDataSource = (IList)value;
    ItemCount = _OriginalDataSource.Count;
    }
    catch(InvalidCastException e)
    {
    _OriginalDataSource = null;
    ItemCount = 0;
    }
    }
    get
    {
    return _OriginalDataSource;
    }
    } public object CurrentPageDataSource
    {
    get
    {
    return ViewState[KEY_CURRENT_PAGE_DATA_SOURCE];
    }
    set
    {
    ViewState[KEY_CURRENT_PAGE_DATA_SOURCE] = value;
    }
    } protected int ItemCount
    {
    get
    {
    return (int)ViewState[KEY_ITEM_COUNT];
    }
    set
    {
    ViewState[KEY_ITEM_COUNT] = value;
    }
    } public int CurrentPageIndex
    {
    get
    {
    return (int)ViewState[KEY_CURRENT_PAGE_INDEX];
    }
    set
    {
    ViewState[KEY_CURRENT_PAGE_INDEX] = value;
    }
    } public int PageSize
    {
    get
    {
    return (int)ViewState[KEY_PAGE_SIZE];
    }
    set
    {
    ViewState[KEY_PAGE_SIZE] = value;
    }
    } protected int PageCount
    {
    get
    {
    if (ItemCount % PageSize == 0)
    {
    return ItemCount / PageSize;
    }
    else
    {
    return ItemCount / PageSize + 1;
    }
    }
    } public string EmptyText
    {
    get
    {
    return (string)_emptyText;
    }
    set
    {
    _emptyText = value;
    }
    } protected override void OnLoad(System.EventArgs e)
    {
    if (! Page.IsPostBack && Visible)
    {
    CurrentPageIndex = 0;

    }
    } private void PreviousClicked(object sender,ImageClickEventArgs e)
    {
    OnPageIndexChanged(new DataGridPageChangedEventArgs(sender, CurrentPageIndex - 1));
    } private void MoreClicked( object sender, ImageClickEventArgs e)
    {
    OnPageIndexChanged(new DataGridPageChangedEventArgs(sender, CurrentPageIndex + 1));
    } private void ddlJump_SelectedIndexChanged(object sender ,System.EventArgs e )
    {
    OnPageIndexChanged(new DataGridPageChangedEventArgs(sender, ((DropDownList)sender).SelectedIndex));
    }

    protected override void CreateControlHierarchy(bool useDataSource)
    {

    btnPrev = new ImageButton();
    btnPrev.ImageUrl = IMG_PREV;
    btnPrev.Click +=new ImageClickEventHandler(PreviousClicked);
    Controls.Add(btnPrev); btnMore = new ImageButton();
    btnMore.ImageUrl = IMG_MORE;
    btnMore.Click+=new ImageClickEventHandler(MoreClicked);
    Controls.Add(btnMore); ddlJumpUp = new DropDownList();
    ddlJumpUp.AutoPostBack = true;
    int i ;
    for (i = 1 ;i<=PageCount;i++)
    {
    ddlJumpUp.Items.Add(i.ToString());
    }
    ddlJumpUp.SelectedIndex = CurrentPageIndex;
    ddlJumpUp.SelectedIndexChanged+=new System.EventHandler(ddlJump_SelectedIndexChanged);
    Controls.Add(ddlJumpUp); base.CreateControlHierarchy(useDataSource); ddlJumpDown = new DropDownList();
    ddlJumpDown.AutoPostBack = true;
    for (i = 1 ;i<=PageCount;i++)
    {
    ddlJumpDown.Items.Add(i.ToString());
    }
    ddlJumpDown.SelectedIndex = CurrentPageIndex;
    ddlJumpDown.SelectedIndexChanged+=new System.EventHandler(ddlJump_SelectedIndexChanged);
    Controls.Add(ddlJumpDown);
    } protected override void OnPreRender(System.EventArgs e)
    {
    if (Mode == ModeType.Update)
    {
    btnPrev.Enabled = CurrentPageIndex > 0;
    btnMore.Enabled = CurrentPageIndex + 1 < PageCount;
    ddlJumpUp.Enabled = true;
    ddlJumpDown.Enabled = true;}
    else if (Mode == ModeType.Insert)
    {  
    btnPrev.Enabled = false;
    btnMore.Enabled = false;
    ddlJumpUp.Enabled = false;
    ddlJumpDown.Enabled = false;
    }
    if (btnPrev.Enabled )
    {
    btnPrev.CssClass = "imageButtonEnabled";
    }
    else
    {
    //btnPrev.CssClass = "imageButtonDisabled";
    } if (btnMore.Enabled)
    {
    //btnMore.CssClass = "imageButtonEnabled";
    }
    else
    {
    //btnMore.CssClass = "imageButtonDisabled";
    } SetEditable(Mode != ModeType.Insert);
    }
      

  2.   

    protected override void Render(System.Web.UI.HtmlTextWriter writer )
    {
    try
    {
    if ((ItemCount == 0) && (Mode != ModeType.Insert))
    {
    writer.Write(EmptyText);
    return;
    }
    writer.Write(HTML1);
    writer.Write("P{0}/{1}({2}件)", CurrentPageIndex + 1, PageCount, ItemCount);
    writer.Write(HTML2);
    btnPrev.RenderControl(writer);
    writer.Write(HTML3);
    btnMore.RenderControl(writer);
    writer.Write(HTML4);
    ddlJumpUp.RenderControl(writer);
    writer.Write(HTML5);
    writer.Write(HTML_SEPERATOR); DataGridItem dgItem= HeaderItem;
    if (dgItem != null)
    {
    dgItem.Visible = (Mode == ModeType.Insert);
    }
    for (int I = 3 ;I<(Controls.Count - 2);I++)
    {
    Controls[I].RenderControl(writer);
    } writer.Write(HTML1);
    writer.Write("P{0}/{1}({2}件)", CurrentPageIndex + 1, PageCount, ItemCount);
    writer.Write(HTML2);
    btnPrev.RenderControl(writer);
    writer.Write(HTML3);
    btnMore.RenderControl(writer);
    writer.Write(HTML4);
    ddlJumpDown.RenderControl(writer);
    writer.Write(HTML5);
    }
    catch (Exception ex)
    {
    //エラー処理
    Console.Write(ex.Message );
    }
    } public void SetPage(int index)
    {
    OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index));
    } public event DataGridPageChangedEventHandler PageIndexChanged; protected virtual void OnPageIndexChanged(DataGridPageChangedEventArgs e) 
    {
    if (PageIndexChanged != null)
    {
    PageIndexChanged(this, e);
    }
    } protected override void OnDataBinding(System.EventArgs e)
    {
    int start= CurrentPageIndex * PageSize;
    int size = Math.Min(PageSize, ItemCount - start);
    IList _page= new ArrayList();
    for (int i = 0 ;i<= (size - 1);i++)
    {
    _page.Add(_OriginalDataSource[start + i]);
    }
    CurrentPageDataSource = _page;
    base.DataSource = _page;
    base.OnDataBinding(e);
    } public DataGridItem HeaderItem 
    {
    get
    {  
    foreach (WebControl con in Controls)
    {

    if (con.GetType() == typeof(DataGridItem )) 
    {
    DataGridItem dgItem = (DataGridItem)con;
    if (dgItem.ItemType ==System.Web.UI.WebControls.ListItemType.Header) 
    {
    return dgItem;
    }
    }
    }
    return null;
    }
    }

    public IList ItemCollection
    {
    get
    {
    IList Items = new ArrayList();


    foreach ( WebControl  con in Controls )
    {
    if (con.GetType()==typeof(DataListItem) )
    {
    DataListItem dgItem = (DataListItem)con;
    if ((dgItem.ItemType == ListItemType.Item) || (dgItem.ItemType == ListItemType.AlternatingItem ))
    {
    Items.Add(dgItem);
    }
    }
    }
    return Items;
    }
    } private void SetEditable(bool value)
    {
    if (SetEditStatus )
    {
    foreach (DataListItem  dgItem in ItemCollection)
    {
    foreach(Control cont in dgItem.Controls)
    {
    if( cont.GetType() == typeof(TextBox) )
    {
    ((TextBox)cont).Enabled = value;
    }  
    else if (cont.GetType() == typeof(CheckBox) )
    {
    ((CheckBox)cont).Enabled = value;
    }
    else if ( cont.GetType() == typeof(DropDownList))
    {
    ((DropDownList)cont).Enabled = value;
    }
    }
    }
    }
    } public void ResetContents()
    {
    base.DataSource = CurrentPageDataSource;
    base.OnDataBinding(new EventArgs());
    } public void ResetHeaderSubControlBackColor()
    {
    foreach( Control cont in HeaderItem.Controls)
    { if (cont.GetType() == typeof(TextBox))
    {
    //((TextBox)cont).BackColor = SystemConsts.NormalBackColor;
    }
    else if (cont.GetType() == typeof(DropDownList))
    {
    //((DropDownList)cont).BackColor = SystemConsts.NormalBackColor;
    }
    }
    } public void ResetSubControlBackColor()
    {
    foreach( DataListItem dlItem in ItemCollection)
    {
    foreach (Control cont in dlItem.Controls)
    {
    if (cont.GetType() == typeof(TextBox ))
    {
    //((TextBox)cont).BackColor = SystemConsts.NormalBackColor;
    }
    else if (cont.GetType() == typeof(DropDownList))
    {
    //((DropDownList)cont).BackColor = SystemConsts.NormalBackColor;  
    }
    }
    }
    } public SuperDataGrid()
    {
    // 
    // TODO: コンストラクタ ロジックをここに追加してください。
    //
    }


    }
    }
    namespace ServerControls
    {
    public class SuperDataGridDesigner:System.Web.UI.Design.WebControls.DataListDesigner
    {
    public override string GetDesignTimeHtml() 
    {
    return base.GetDesignTimeHtml();
    //return "<b>OK</b>";
    } }
    }
      

  3.   

    to ,athossmth(athos) () 
    怎么不回答,忘了,也许你看到得分问题的时候会想起来,分全给你了!