2012-05-10 54 views
0

我有一個CustomGridView(擴展GridView)和一個DataPager,並且所有在.net 3.5中都能正常工作,但在.net 4中不能正常工作。問題是,當回發發生在首先視圖狀態在網格中丟失。這是一個大型項目,並且在每次回發時都會發生數據綁定,因爲它有太多的代碼需要更新(我們開始了,但我們只創建了更多的bug),因此這不是一個選項。當使用DataPager時,GridView在回發時丟失數據

我已經測試了內置的DataPager webcontrol,並且我用相同的結果做了我自己的。我們知道我們應該爲網格使用內置的尋呼機,但這種解決方案是不可能的,因爲它需要更新的代碼太多。

的問題出現在使用該CustomGridView所有頁面和gridpage 1一切正常

這是一個已知的問題,是有解決方法嗎?

我給你同樣的問題發生的歷史一個簡單的項目代碼(.NET 3.5中工作,但不是.NET 4):

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

在NET4.0工作時,你有沒有得到任何錯誤消息的OnPreRender()方法裏面? JS控制檯消息? – rt2800

回答

0

儘量把DataBind(0);網頁表單

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

它沒有區別 –