升级到.net 4.6后,Gridview分页无法工作



经过几天的思考,我决定寻求帮助,因为我被一个我认为可能是。net 4.6的bug所困扰。

我有一个gridview与对象数据源与分页(下面是一个简化的版本),一切都工作得很好。有一天,在常规的Windows更新后,gridview开始有一个奇怪的行为(我稍后会解释),在排除故障后,我意识到这是由于安装了。net 4.6升级。我能够在几台Windows 2012 R2机器和Windows 8.1(包括Visual Studio 2013)上重现这个问题,当我删除。net 4.6时,一切又开始工作了。

我有一个带有VS2015的Windows 8.1,所以我在那里测试了它,也能够重现这个问题(在VS2015上,我不能删除。net 4.6,因为它是VS2015的要求)。为了进一步调试问题,我一直使用VS2015。

为了使解释更容易,我发布了VS2015版本,这是原始gridview的剥离版本,我一直在使用它进行测试。

<%@ Page Title="Top of Shame" Language="C#" CodeBehind="HallOfShame.aspx.cs" Inherits="SissdwWebSite.Siss.SwingWorker.HallOfShame" EnableViewState="false" %>
<body>
<form runat="server">
    <asp:GridView
        ID="GvSwingWorkersOfShame" runat="server" DataSourceID="DsSwingWorkersOfShame" AutoGenerateColumns="false" PagerSettings-Mode="NextPreviousFirstLast" 
        AllowPaging="True" AllowCustomPaging="true">
        <Columns>
            <asp:BoundField DataField="RowNumber" HeaderText="Pos." ItemStyle-HorizontalAlign="Right" />
        </Columns>
    </asp:GridView>
    <p></p>
    <asp:ObjectDataSource ID="DsSwingWorkersOfShame" runat="server" EnablePaging="true"
        SelectMethod="GetData" TypeName="SissdwWebSite.DataLayer.SissdwTableAdapters.HallOfShameTableAdapter"
        SelectCountMethod="GetHallOfShameCount">
        <SelectParameters>
            <asp:Parameter Name="CodOper" Type="String" ConvertEmptyStringToNull="false" />
        </SelectParameters>
    </asp:ObjectDataSource>
</form>
</body>

gridview预计会产生如下所示的列表(原始版本有大约10列,但我将其简化为只有第一个行号,以使事情更容易理解)。输出是HTML,但是我不能在这里复制它,但是你明白了。

Pos .

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

& lt; & lt; & lt;>>>

现在的问题是:在上面的代码中,gridview完全按照预期工作。如果我把那个自定义寻呼机放在下面(或者我尝试过的其他几个组合),gridview就会开始落后一次点击。

        <PagerTemplate>
            <table>
                <tr>
                    <td style="width: 30%">
                        <asp:LinkButton runat="server" ID="First" CommandArgument="First" CommandName="Page">
                            <img id="imgFirst" runat="server" src="~/images/2leftarrow.png" height="16" width="16" />
                        </asp:LinkButton>
                        <asp:LinkButton runat="server" ID="Prev" CommandArgument="Prev" CommandName="Page">
                            <img id="imgPrev" runat="server" src="~/images/1leftarrow.png" height="16" width="16" />
                        </asp:LinkButton>
                        <asp:LinkButton runat="server" ID="Next" CommandArgument="Next" CommandName="Page">
                            <img id="imgNext" runat="server" src="~/images/1rightarrow.png" height="16" width="16" />
                        </asp:LinkButton>
                        <asp:LinkButton runat="server" ID="Last" CommandArgument="Last" CommandName="Page">
                            <img id="imgLast" runat="server" src="~/images/2rightarrow.png" height="16" width="16" />
                        </asp:LinkButton>
                    </td>
                </tr>
            </table>
        </PagerTemplate>

通过滞后一次点击,我的意思是,在我第一次点击前进箭头时,没有任何事情发生在显示的结果上(但PageIndex从0移动到1)。第二次,它显示位置11-20,内部PageIndex从1移动到2,等等。

再往下,如果我点击"转到第一页",它只会在我做其他操作时转到第一页(即,它总是落后于一个命令)。我不知道这是否很清楚,但有一个小标签显示当前页面,它显示一个"页面后面"我的最后一个命令。

请记住,如果我删除了pager模板,一切都很好,在。net 4.5.2中,一切都工作得很好,无论pager模板是什么。

我试着调试。net 4.6框架,但我无法理解它,无法弄清楚发生了什么。

总结:是。net 4.6的bug,还是我遗漏了什么?是否有一种方法,使我的网格视图工作正常再次在。net 4.6,无论是通过修复我的代码或由于一些其他的解决方案?

任何进一步解决问题的建议都可以…

编辑:关于这个问题的一些额外澄清。我在几个事件处理程序的每个阶段打印PageIndex。初始页面加载

Page_Load =0
GvSwingWorkersOfShame_DataBinding =0
GvSwingWorkersOfShame_DataBound =0
Pos.
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

准时点击前进后:

Page_Load =0
GvSwingWorkersOfShame_DataBinding =0
GvSwingWorkersOfShame_DataBound =0
GvSwingWorkersOfShame_PageIndexChanging =0
GvSwingWorkersOfShame_PageIndexChanged =1
GvSwingWorkersOfShame_DataBinding =1
GvSwingWorkersOfShame_DataBound =1
Pos.
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

这是4.6.1中的一个回归。该错误已在4.6.1中修复。您可以安装4.6.1 RC来验证修复,并等待应该很快发布的RTM。

最新更新