0

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

組み込みの DataPager Web コントロールの両方をテストし、同じ結果で独自のものを作成しました。グリッドに組み込みのページャーを使用する必要があることはわかっていますが、コードが多すぎて更新できないため、その解決策は不可能です。

この問題は、CustomGridView を使用するすべてのページで発生し、グリッドページ 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);
    }
}
4

1 に答える 1

0

WebフォームのメソッドのDataBind(0);中に入れてみてくださいOnPreRender()

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);
    DataBind(0);
}
于 2012-05-10T08:46:51.417 に答える