Пейджинг Gridview не работает после обновления до .Net 4.6

После того, как я ударился головой в течение нескольких дней, я решил обратиться за помощью, так как я застрял с тем, что, как я думаю, может быть ошибкой .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 

person Rui Bastos    schedule 15.10.2015    source источник
comment
После дальнейшего устранения неполадок мне удалось сузить круг до EnableViewState. С .Net 4.5.2 он будет работать с EnableViewState=false на уровне страницы, с 4.6 он не будет работать, даже если я установлю EnableViewState=true в представлении сетки и/или источнике данных. Но если я устанавливаю его на уровне страницы, он работает нормально. Проблема в том, что на исходном сайте страница наследуется от главной страницы, и мне нужно будет включить ее, и это повлияет на весь сайт :(   -  person Rui Bastos    schedule 19.10.2015


Ответы (1)


Это регресс в 4.6.1. Ошибка была исправлена ​​в версии 4.6.1. Вы можете установить 4.6.1 RC, чтобы проверить исправление и дождаться RTM, который должен быть выпущен в ближайшее время.

person mattfei    schedule 17.11.2015
comment
Спасибо. Я посмотрю и отпишусь. - person Rui Bastos; 20.11.2015