Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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" Text='<%# 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

like image 329
Tassisto Avatar asked Mar 18 '11 12:03

Tassisto


People also ask

How to add sorting in GridView?

Drag and drop gridview on your page. Set AllowSorting property to true , add OnSorting event to the gridview . Create data table that you want to assign to the GridView .

What is sort expression in GridView?

When the Sorting event is raised, you can use the SortExpression property to determine the sort expression that will be used to sort the GridView control when sort operation is performed. By default, the GridView control sorts a single column at a time. The sort expression simply contains the name of the field to sort.

How do you sort data in GridView by clicking column header in asp net?

HTML. Start by adding a GridView to your web page. To make the columns sortable, you need to set the GridView's property AllowSorting = “true” and OnSorting = “OnSorting”. SortExpression property will hold the name of the column you want to sort.


2 Answers

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.
    }
}
like image 61
Kynth Avatar answered Sep 22 '22 15:09

Kynth


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;
}
like image 41
Turbo Avatar answered Sep 22 '22 15:09

Turbo