【问题标题】:How to allow sorting of a gridview?如何允许对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>

感谢任何帮助

【问题讨论】:

标签: c# asp.net gridview


【解决方案1】:

如其他答案中所述,您的BoundField 中缺少SortExpression

您还使用了TemplateField,这取决于生成数据的内容,可能需要手动排序而不是使用SortExpression

如果是这种情况,那么要手动排序,一种方法是将OnSorting 回调添加到您的字段中的GridViewSortExpression,并在您的代码隐藏中添加一个回调方法。

这将导致标记和代码类似于(未经测试):

<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.
    }
}

【讨论】:

【解决方案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 articlethis example with sorting and paging

【讨论】:

    【解决方案4】:

    我假设您的网格视图的数据源是 DataTable,所以我认为您必须添加

    SortExpression="column name"
    

    在您希望能够排序的每个 asp:Bound 字段中,

    例如

    <asp:BoundField DataField="Melder" SortExpression="Melder" HeaderText="Melder" />
    

    【讨论】:

    • 我已经更新了这个问题,我按照你说的做了,但我仍然得到错误。 --> “GridView 'gvOutlookMeldingen' 触发了未处理的排序事件。”
    • gridview的数据源是什么,是通用列表,数据表吗?
    • 它是一个数据表,我有另一个网格视图,我在 SQL 的帮助下填充它
    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2016-12-27
    • 1970-01-01
    • 2015-09-06
    相关资源
    最近更新 更多