我有一個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);
}
}
在NET4.0工作時,你有沒有得到任何錯誤消息的
OnPreRender()
方法裏面? JS控制檯消息? – rt2800