经过几天的思考,我决定寻求帮助,因为我被一个我认为可能是。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。