How to allow sorting of a gridview?
I have a gridview and enabled sorting. When running the application I click on the first column to sort. And I get this error: "The GridView 'gvOutlookMeldingen' fired event Sorting which wasn't handled."
This is the gridview:
<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" Tex开发者_StackOverflowt='<%# Bind("Omschrijving")%>'></asp:Label>
</div>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Meldingsdatum" HeaderText="Meldingsdatum" />
<asp:BoundField DataField="OutlookID" HeaderText="OutlookID" />
</Columns>
</asp:GridView>
Any help is appreciated
You are missing SortExpression
's in your BoundField
's as mentioned in the other answers.
You are also using a TemplateField
which, depending on what is generating your data, may require manual sorting beyond use of SortExpression
.
If this is the case, then to sort manually, one method is to add an OnSorting
callback to the GridView
, SortExpression
's to your fields and a method to callback in your code-behind.
This would result in markup and code similar to (untested):
<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>
...and:
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.
}
}
This code might help (for you guys googling this old post):
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;
}
You need to set the SortExpression
attribute of the columns you want to sort on. And you need to add an event handler to the Sorting
event to make the sort work on your DataSource.
For more information, see this MSDN article, or this example with sorting and paging.
I assume the datasource of your grid view is a DataTable so I think you have to add
SortExpression="column name"
in every asp:Boundfield that you like to be able to sort,
for example
<asp:BoundField DataField="Melder" SortExpression="Melder" HeaderText="Melder" />
精彩评论