2012-05-10 17 views
0

CustomGridView(拡張GridView)とDataPagerがあり、すべてが.net 3.5では正常に動作しますが、.net 4では正常に動作します。最初にグリッドのビューステートが失われます。それは大規模なプロジェクトであり、各ポストバックでデータバインディングが発生するようにすることはオプションではありません。更新するにはコードが多すぎます(開始しましたが、より多くのバグが作成されました)。DataPagerを使用すると、GridViewがポストバックに関するデータを失う

私は組み込みのDataPager Webコントロールをテストしましたが、私は同じ結果で自分自身を作っています。グリッド用にページャーを組み込む必要があることはわかっていますが、コードを更新するにはあまりにも多くのコードが必要です。

問題がCustomGridViewを使用するすべてのページに及び

が、これは既知の問題であり、回避策がある1、すべてが正常に動作しgridpageで発生しますか?

は、私はあなたに同じ問題のoccuringとの単純なプロジェクトからコードを与える(.NET 3.5での作業ではなく、4 .NET):

のWebForm1.aspx:

<cc1:SimpleCustomGridView ID="CustomGridView1" runat="server" 
     AutoGenerateColumns="false" PageSize="4" AllowPaging="true" 
     onpageindexchanging="CustomGridView1_PageIndexChanging" 
     onrowcommand="CustomGridView1_RowCommand" EnableViewState="true" ViewStateMode="Enabled" Visible="true"> 
     <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:LinkButton ID="lnkButton" runat="server" Text='<%#Eval("Name") %>' CommandName="lnkClick" CommandArgument='<%#Eval("Id") %>'></asp:LinkButton> 
      </ItemTemplate> 
     </asp:TemplateField> 
     </Columns> 
    </cc1:SimpleCustomGridView> 
    <br /> 
    <uc:DataPager ID="DataPager" runat="server" CustomGridViewID="CustomGridView1" /> 

WebForm1.aspx.csを:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     DataBind(0); 
    } 
} 

private void DataBind(int pageIndex) 
{ 
    int rowIndex = pageIndex * CustomGridView1.PageSize; 
    int pageSize = CustomGridView1.PageSize; 
    int total; 
    List<DataContainer> list = DataContainer.GetData(rowIndex, pageSize, out total); 
    CustomGridView1.RowCount = total; 
    CustomGridView1.DataSource = list; 
    CustomGridView1.DataBind(); 
} 

protected void CustomGridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    if (e.NewPageIndex > -1) 
    { 
     CustomGridView1.PageIndex = e.NewPageIndex; 
     DataBind(e.NewPageIndex); 
    } 
} 

protected void CustomGridView1_RowCommand(object sender, GridViewCommandEventArgs e) { } 

SimpleCustomGridView.cs:

public class SimpleCustomGridView : GridView 
{ 
    public override int PageIndex 
    { 
     get 
     { 
      if (ViewState[this.ClientID + "PAGEINDEX"] == null) 
       ViewState[this.ClientID + "PAGEINDEX"] = 0; 
      return (int)ViewState[this.ClientID + "PAGEINDEX"]; 
     } 
     set 
     { 
      base.PageIndex = value; 
      ViewState[this.ClientID + "PAGEINDEX"] = value; 
     } 
    } 

    public int RowCount 
    { 
     set 
     { 
      HttpContext.Current.Session[this.ClientID + "TOTALPAGECOUNT"] = value; 
     } 
     get 
     { 
      return HttpContext.Current.Session[this.ClientID + "TOTALPAGECOUNT"] == null ? 0 : 
       Convert.ToInt32(HttpContext.Current.Session[this.ClientID + "TOTALPAGECOUNT"]); 
     } 
    } 

    public void GotoPage(int pageIndex) 
    { 
     GridViewPageEventArgs args = new GridViewPageEventArgs(pageIndex); 
     OnPageIndexChanging(args); 
    } 
} 

CustomGridViewpager.ascx.cs:

public partial class CustomGridViewpager : UserControl 
{ 
    public string CustomGridViewID { get; set; } 

    private SimpleCustomGridView _gridView; 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     _gridView = (SimpleCustomGridView)Parent.FindControl(CustomGridViewID); 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 

     int totalRows = _gridView.RowCount; 
     int pageIndex = _gridView.PageIndex; 
     int pageSize = _gridView.PageSize; 
     int totalPages = (int)Math.Ceiling(totalRows/(double)pageSize); 

     StringBuilder sb = new StringBuilder(); 
     sb.Append(pageIndex + 1); 
     sb.Append("/"); 
     sb.Append(totalPages); 
     PageIndexLabel.Text = sb.ToString(); 

     PrevPageButton.Visible = pageIndex > 0; 
     NextPageButton.Visible = pageIndex < totalPages - 1; 

    } 

    protected void NextPageButton_Click(object sender, EventArgs e) 
    { 
     _gridView.GotoPage(_gridView.PageIndex + 1); 

    } 

    protected void PrevPageButton_Click(object sender, EventArgs e) 
    { 
     _gridView.GotoPage(_gridView.PageIndex - 1); 
    } 
} 
+0

OnPreRender()メソッド内DataBind(0);を入れて試してみてください、あなたはすべてのエラーメッセージを取得するのですか? JSコンソールメッセージ? – rt2800

答えて

0

がNET4.0での作業中にWebフォーム

protected override void OnPreRender(EventArgs e) 
{ 
    base.OnPreRender(e); 
    DataBind(0); 
} 
+0

違いはありません –

関連する問題