Member 13952925 Ответов: 2

Броски проблем с переполнением стека при выполнении сортировки в GridView столбцов


У меня есть gridview, и я пытаюсь выполнить сортировку по столбцу. Когда я это делаю, он выбрасывает исключение "StackOverflow"

Что я уже пробовал:

код aspx:

<asp:GridView ID="grdItems" runat="server"  Width="100%" AllowPaging="True"
                CellPadding="4" ForeColor="#333333" GridLines="None" AutoGenerateColumns="False" OnRowDataBound="grdItems_RowDataBound" AllowSorting="True" OnSorting="grdItems_Sorting">
                <FooterStyle BackColor="White" Font-Bold="True" ForeColor="#808080"/>
                <RowStyle BackColor="#EFF3FB" />
                <EditRowStyle BackColor="#2461BF" />
                <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                <pagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" Font-Size="Small" />
                <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                <AlternatingRowStyle BackColor="White" />
                <Columns>

                    <asp:BoundField DataField="actionItemId" HeaderText="Item Id" SortExpression="actionItemId" >
                        <ItemStyle Font-Size="Small" VerticalAlign="Top" />
                        <HeaderStyle Font-Bold="True" Font-Size="Small" HorizontalAlign="Left" Width="65px"/>
                        <FooterStyle Font-Size="12px" />
                    </asp:BoundField>
                    <asp:BoundField DataField="dueDate" DataFormatString="{0:d}" HeaderText="Due By" HtmlEncode="False" >
                        <ItemStyle Font-Size="Small" VerticalAlign="Top" />
                        <HeaderStyle Font-Size="Small" HorizontalAlign="Left" Width="65px" />
                    </asp:BoundField>
</Columns>
            <pagerSettings Mode="NumericFirstLast" />
        </asp:GridView>


с фоновым кодом:

Protected Sub grdItems_Sorting(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles grdItems.Sorting
        Dim sortExpression As String = e.SortExpression
        ViewState("SortExpression") = sortExpression

        If grdItems.SortDirection = WebControls.SortDirection.Ascending Then
            grdItems.Sort(sortExpression, WebControls.SortDirection.Descending)
        Else
            grdItems.Sort(sortExpression, WebControls.SortDirection.Ascending)
        End If

    End Sub


Теперь я знаю, что, поскольку я использую Sort() внутри обработчика событий сортировки, он выдает мне это исключение. Есть ли другой способ обойти это? Любая помощь будет очень признательна. Спасибо!

2 Ответов

Рейтинг:
9

Member 13915320

Вам не нужно сортировать внутри события сортировки. Вы просто связываете сетку с новым sortexpression.


Следующее не требуется:

grdItems.SortDirection = WebControls.SortDirection.Ascending Then
           grdItems.Sort(sortExpression, WebControls.SortDirection.Descending)
       Else
           grdItems.Sort(sortExpression, WebControls.SortDirection.Ascending)
       End If


Вместо этого напишите что-нибудь вроде этого:
If grdItems.SortDirection = WebControls.SortDirection.Ascending Then
	grdItems.sortexpression =sortExpression + " " +  WebControls.SortDirection.Descending
Else
	grdItems.sortexpression =sortExpression + " " +  WebControls.SortDirection.Ascending
End If
grdItems.databind()


Рейтинг:
16

OriginalGriff

Просто: не вызывайте сортировку внутри обработчика событий сортировки - потому что он вызовет событие сортировки, которое вызовет метод сортировки, который вызовет событие сортировки, которое ...
Вы поняли идею.

Почему вы хотите сортировать в середине сортировки в любом случае?


Member 13952925

Как бы я тогда сортировал конкретный столбец?

OriginalGriff

Видеть здесь:
https://www.codeproject.com/Tips/663532/How-to-Perform-Sorting-in-Gridview-in-ASP-NET