开发者

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" />
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜