如何允许对gridview进行排序?
Posted
技术标签:
【中文标题】如何允许对gridview进行排序?【英文标题】:How to allow sorting of a gridview? 【发布时间】:2011-07-18 03:52:18 【问题描述】:我有一个 gridview 并启用了排序。运行应用程序时,我单击第一列进行排序。我收到此错误:“未处理的 GridView 'gvOutlookMeldingen' 触发事件排序。”
这是网格视图:
<asp:GridView ID="gvOutlookMeldingen" runat="server" AllowSorting="True" AutoGenerateColumns="False" AutoGenerateSelectButton="True" onselectedindexchanged="GridView_SelectedIndexChanged">
<Columns>
<asp:TemplateField HeaderText="Melder" ItemStyle-HorizontalAlign="Center" SortExpression="Melder">
<HeaderStyle BorderColor="#1A3491" Width="130px"></HeaderStyle>
<ItemStyle Height="20px" HorizontalAlign="Center"></ItemStyle>
<ItemTemplate>
<%# (string)Eval("Melder") %>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Onderwerp" HeaderText="Onderwerp" />
<asp:TemplateField HeaderText="Omschrijving">
<ItemTemplate>
<div style="overflow:auto; width: 500px; height: 200px;">
<asp:Label ID="lblOmschrijving" runat="server" Text='<%# Bind("Omschrijving")%>'></asp:Label>
</div>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Meldingsdatum" HeaderText="Meldingsdatum" />
<asp:BoundField DataField="OutlookID" HeaderText="OutlookID" />
</Columns>
</asp:GridView>
感谢任何帮助
【问题讨论】:
如下所述,我可以建议研究 Linq to SQL。似乎该表是使用 sql 填充的。使用 Linq to SQL 可以更轻松地对事物进行排序 更好的方法是***.com/questions/3966835/sorting-gridview 【参考方案1】:如其他答案中所述,您的BoundField
中缺少SortExpression
。
您还使用了TemplateField
,这取决于生成数据的内容,可能需要手动排序而不是使用SortExpression
。
如果是这种情况,那么要手动排序,一种方法是将OnSorting
回调添加到您的字段中的GridView
、SortExpression
,并在您的代码隐藏中添加一个回调方法。
这将导致标记和代码类似于(未经测试):
<asp:GridView ID="gvOutlookMeldingen" runat="server"
AllowSorting="True"
OnSorting="gvOutlookMeldingen_Sorting"
AutoGenerateColumns="False"
AutoGenerateSelectButton="True"
onselectedindexchanged="GridView_SelectedIndexChanged">
<Columns>
<asp:BoundField DataField="Melder" HeaderText="Melder" SortExpression="Melder" />
<asp:BoundField DataField="Onderwerp" HeaderText="Onderwerp" SortExpression="Onderwerp" />
<asp:TemplateField HeaderText="Omschrijving" SortExpression="Omschrijving">
<ItemTemplate>
<div style="overflow:auto; width: 500px; height: 200px;">
<asp:Label ID="lblOmschrijving" runat="server" Text='<%# Bind("Omschrijving")%>'></asp:Label>
</div>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Meldingsdatum" HeaderText="Meldingsdatum" SortExpression="Meldingsdatum" />
<asp:BoundField DataField="OutlookID" HeaderText="OutlookID" SortExpression="OutlookID" />
</Columns>
</asp:GridView>
...和:
protected void gvOutlookMeldingen_Sorting(object sender, GridViewSortEventArgs e)
switch (e.SortExpression)
case "Melder":
if (e.SortDirection == SortDirection.Ascending)
gvOutlookMeldingen.DataSource = // Asc query for Melder field;
gvOutlookMeldingen.DataBind();
else
gvOutlookMeldingen.DataSource = // Desc query for Melder field ;
gvOutlookMeldingen.DataBind();
break;
// case statements for your other fields.
【讨论】:
我使用数据表的数据源怎么样。所以我也必须对该数据表进行排序?你知道吗? 有几种方法可以做到,我通常出于习惯使用Linq。这里有一个很好的答案:***.com/questions/10855/linq-query-on-a-datatable 如果我将文件夹中的文件用于 DataSource,我将如何实现呢? ***.com/questions/24491778/…【参考方案2】:这段代码可能会有所帮助(对于那些在谷歌上搜索这篇旧帖子的人):
protected void gvOutlookMeldingen_Sorting(object sender, GridViewSortEventArgs e)
DataTable dt = (DataTable)Session["mySessionStoredTable"];
dt.DefaultView.Sort = e.SortExpression // column name
+ " " + SortDir(e.SortExpression); // sort direction
gv.DataSource = dt;
gv.DataBind();
private string SortDir(string sColumn)
string sDir = "asc"; // ascending by default
string sPreviousColumnSorted = ViewState["SortColumn"] != null
? ViewState["SortColumn"].ToString()
: "";
if (sPreviousColumnSorted == sColumn) // same column clicked? revert sort direction
sDir = ViewState["SortDir"].ToString() == "asc"
? "desc"
: "asc";
else
ViewState["SortColumn"] = sColumn; // store current column clicked
ViewState["SortDir"] = sDir; // store current direction
return sDir;
【讨论】:
@ChristopherBruce 这是你的网络表单【参考方案3】:您需要设置要排序的列的SortExpression
属性。并且您需要向Sorting
事件添加一个事件处理程序,以使您的数据源上的排序工作。
有关详细信息,请参阅 this MSDN article 或 this example with sorting and paging。
【讨论】:
【参考方案4】:我假设您的网格视图的数据源是 DataTable,所以我认为您必须添加
SortExpression="column name"
在您希望能够排序的每个 asp:Bound 字段中,
例如
<asp:BoundField DataField="Melder" SortExpression="Melder" HeaderText="Melder" />
【讨论】:
我已经更新了这个问题,我按照你说的做了,但我仍然得到错误。 --> “GridView 'gvOutlookMeldingen' 触发了未处理的排序事件。” gridview的数据源是什么,是通用列表,数据表吗? 它是一个数据表,我有另一个网格视图,我在 SQL 的帮助下填充它以上是关于如何允许对gridview进行排序?的主要内容,如果未能解决你的问题,请参考以下文章
如何在颤动中减小gridview.builder的gridview项之间的空间大小
对 GridView 或其支持的 ObservableCollection 进行排序的正确方法?