C# ASP GridView排序事件未触发

C# ASP GridView排序事件未触发,c#,asp.net,sorting,gridview,C#,Asp.net,Sorting,Gridview,在用尽我的google fu并回顾了几个标题相似但不适用的问题之后,是时候发布了 我有一个ASP GridView,希望用户能够对其进行排序。据我所知,它的配置是正确的,但是当单击列标题时网格没有响应,并且服务器端事件处理程序从未被调用。我已经检查了浏览器的javascript错误,但没有记录任何错误。我确实看到发布了POST请求,并收到了200个响应。请求和响应似乎主要由ViewState对象组成 我的网格视图。请注意,它位于UpdatePanel中,但删除UpdatePanel时的行为是相同

在用尽我的google fu并回顾了几个标题相似但不适用的问题之后,是时候发布了

我有一个ASP GridView,希望用户能够对其进行排序。据我所知,它的配置是正确的,但是当单击列标题时网格没有响应,并且服务器端事件处理程序从未被调用。我已经检查了浏览器的javascript错误,但没有记录任何错误。我确实看到发布了POST请求,并收到了200个响应。请求和响应似乎主要由ViewState对象组成

我的网格视图。请注意,它位于UpdatePanel中,但删除UpdatePanel时的行为是相同的

<asp:UpdatePanel runat="server" ID="AssetListUpdatePanel" ChildrenAsTriggers="true" UpdateMode="Conditional" >
    <ContentTemplate>
        <asp:GridView ID="GridViewList" runat="server" AllowPaging="True" AllowSorting="True"
            AutoGenerateColumns="False" EnableModelValidation="True" PageSize="50" DataKeyNames="AssetCode"
            OnRowCommand="GridViewList_RowCommand" BorderColor="#CCCCCC" GridLines="Horizontal" Width="100%"
            OnPageIndexChanging="GridViewList_PageIndexChanging" OnSorting="GridViewList_Sorting" OnRowDataBound="GridViewListRow_DataBound">
            <HeaderStyle HorizontalAlign="Left" />
            <PagerSettings Mode="NumericFirstLast" />
            <AlternatingRowStyle BackColor="#F4F4F4" />
            <Columns>
                <asp:BoundField DataField="AssetCode" HeaderText="ID" ReadOnly="True" SortExpression="AssetCode" />
                <asp:TemplateField HeaderText="Title" SortExpression="Title" ItemStyle-CssClass="wrap">
                    <ItemTemplate>
                        <%# Eval("Title") %><br />
                        <asp:HyperLink CssClass="filename" runat="server" ID="FileLink" Target="_blank" />
                    </ItemTemplate>
                    <ItemStyle CssClass="wrap"></ItemStyle>
                </asp:TemplateField>
                <asp:BoundField DataField="Type" HeaderText="Type" ReadOnly="True" SortExpression="Type">
                    <HeaderStyle HorizontalAlign="Left"></HeaderStyle>
                    <ItemStyle HorizontalAlign="Center"></ItemStyle>
                </asp:BoundField>
                <asp:BoundField DataField="DateCreated" HeaderText="Created" ReadOnly="True" SortExpression="DateCreated">
                    <HeaderStyle HorizontalAlign="Left"></HeaderStyle>
                    <ItemStyle HorizontalAlign="Center"></ItemStyle>
                </asp:BoundField>
                <asp:BoundField DataField="DateModified" HeaderText="Modified" ReadOnly="True" SortExpression="DateModified">
                    <HeaderStyle HorizontalAlign="Left"></HeaderStyle>
                    <ItemStyle HorizontalAlign="Center"></ItemStyle>
            </Columns>
            <RowStyle HorizontalAlign="Left" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" />
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>
网格在FilterByCriteria方法中被重新绑定,请不要对命名法进行任何抨击

private void FilterByCriteria()
{
    DataTable dataTable;
    //retrieve data from DB.
    dataTable = ConvertToDataTable(FilteredAssets());
    DataView dataView = new DataView(dataTable);

    // attach dataview to gridview
    GridViewList.DataSource = dataView;

    // bind
    GridViewList.DataBind();
}

很明显,我遗漏了一些基本的东西,但我没有看到。可能值得注意的是,此GridView的分页方式与。。。也就是说它不是。GridView没有响应,并且从未调用PageIndexChange处理程序。

您没有对数据进行排序,只是更新sort和sortDirection视图状态,除非这一切都发生在FilterByCriteria中。但GridView可能没有实际更改,因此看起来排序方法似乎从未触发过

//get the data again, either from source or ViewState
DataTable dt = getData();
DataTable dt = ViewState["dt"] as DataTable;

//do the sorting
dt.DefaultView.Sort = ViewState["sort"] + " " + ViewState["sortDirection"];

//rebind the data to the gridview
GridView1.DataSource = dt;
GridView1.DataBind();

不必在标记中连接事件处理程序,您可以尝试将它们添加到Page_Init中,看看这是否有什么不同吗?简单地将排序处理程序移动到Page_Init似乎就解决了这两个处理程序的问题,这非常奇怪。您是否了解其中的原因?老实说,不确定网格事件为什么没有触发,但在代码中连接所有内容而不是向标记中添加事件名称一直是我在webforms中的首选,并且一直对我有效。感谢您的输入。事实证明,你已经解决了问题的三分之一。更新重新绑定数据以显式排序数据视图的方法是修复的一部分。出于某种原因,我逐渐明白了这是由GridView而不是DataView造成的。今天晚些时候我会发布完整的解决方案。
//get the data again, either from source or ViewState
DataTable dt = getData();
DataTable dt = ViewState["dt"] as DataTable;

//do the sorting
dt.DefaultView.Sort = ViewState["sort"] + " " + ViewState["sortDirection"];

//rebind the data to the gridview
GridView1.DataSource = dt;
GridView1.DataBind();