升级到 .Net 4.6 后 Gridview 分页不起作用

Gridview paging not working after upgrading to .Net 4.6

经过几天的摸索,我决定寻求帮助,因为我认为可能是 .Net 4.6 错误。

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

我有一个带有 VS 2015 的 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 但我无法在这里重现它,但你明白了。

位置

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

<<<>>>

现在的问题是:在上面的代码中,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,等等。

如果我点击 "go to first",它只会在我执行其他操作时转到第一页(即,它总是滞后于一个命令)。我不知道这是否很清楚,但有一个小标签显示当前页面,它显示 "page behind" 我的最后一条命令。

请记住,如果我删除寻呼机模板一切顺利,并且在 .Net 4.5.2 上一切正常,无论寻呼机模板如何。

我尝试调试 .Net 4.6 框架,但我无法充分理解它,无法弄清楚发生了什么。

总而言之:是.Net 4.6 错误,还是我遗漏了什么?有没有办法让我的 gridview 在 .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。