После того, как я ударился головой в течение нескольких дней, я решил обратиться за помощью, так как я застрял с тем, что, как я думаю, может быть ошибкой .Net 4.6.
У меня было представление сетки с источником данных объекта с пейджингом (ниже приведена упрощенная версия), и все работало нормально. Через день после регулярных обновлений Windows gridview начал вести себя странно (я объясню позже), и после устранения неполадок я понял, что это связано с установленным обновлением .Net 4.6. Мне удалось воспроизвести проблему на нескольких компьютерах с Windows 2012 R2 и Windows 8.1 (включая один с Visual Studio 2013), и когда я удалил .Net 4.6, все снова заработало.
У меня была Windows 8.1 с VS 2015, поэтому я протестировал ее там и также смог воспроизвести проблему (на VS2015 я не могу удалить .Net 4.6, потому что это требование для VS2015). Для дальнейшей отладки проблемы я продолжал использовать этот VS2015.
Чтобы упростить объяснение, я публикую версию VS2015, которая представляет собой урезанную версию оригинальной сетки, и которую я использовал для тестирования.
<%@ 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 и т. д.
Далее по строке, если я нажму «перейти к первому», он перейдет на первую страницу только тогда, когда я выполню какое-либо другое действие (т.е. он всегда отстает от одной команды). Я не знаю, очень ли это ясно, но у меня была небольшая метка, показывающая текущую страницу, и она показывает одну «страницу позади» моей последней команды.
Пожалуйста, помните, что если я удаляю шаблон пейджера, все идет хорошо, и в .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