【发布时间】:2017-06-26 19:32:34
【问题描述】:
用尽了我的 google-fu 并查看了几个标题相似但不适用的 SO 问题,是时候发帖了。
我有一个 ASP GridView,我希望用户能够对其进行排序。据我所知,它已正确配置,但单击列标题时网格无响应,并且永远不会调用服务器端事件处理程序。我检查了浏览器是否有 javascript 错误,但没有记录。我确实看到发出 POST 请求,并收到 200 响应。请求和响应似乎主要由 ViewState 对象组成。
我的 GridView。请注意,它位于 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>
我已经完成了显而易见的事情......将 AllowSorting 设置为 true,定义了 OnSorting 事件处理程序,并为每一列指定了排序表达式。
还有我的排序事件处理程序(同样,它永远不会被调用):
protected void GridViewList_Sorting(object sender, GridViewSortEventArgs e)
{
ViewState["page"] = null;
const string DESC = "DESC";
const string ASC = "ASC";
string SortDirection = DESC;
if (ViewState["sort"] != null &&
ViewState["sort"].ToString() == e.SortExpression &&
(ViewState["sortDirection"] == null ||
ViewState["sortDirection"].ToString() != ASC))
{
SortDirection = ASC;
}
ViewState["sort"] = e.SortExpression;
ViewState["sortDirection"] = SortDirection;
FilterByCriteria();
//now that the grid is sorted, apply a style to the sorted column to
//show the sort status and direction.
var sortedColumnIdx = GetColumnIndex(GridViewList, e.SortExpression);
var styleName = SortDirection.Equals(DESC) ? "sortdesc" : "sortasc";
GridViewList.HeaderRow.Cells[sortedColumnIdx].CssClass = styleName;
}
并且网格在 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 没有响应,并且永远不会调用 PageIndexChanging 处理程序。
【问题讨论】:
-
您可以尝试在 Page_Init 中添加它们,而不是在标记中连接事件处理程序,看看是否有什么不同?
-
简单地将排序处理程序移动到 Page_Init 似乎已经解决了两个处理程序的问题,这很奇怪。您对原因和原因有任何见解吗?
-
不确定为什么说实话,您的网格事件没有触发,但是在代码中连接所有内容而不是向标记添加事件名称一直是我的偏好网络表单,一直为我工作。
标签: c# asp.net sorting gridview