2011-03-18 60 views
20

我有一个gridview并启用排序。在运行应用程序时,我点击第一列进行排序。我得到这个错误:“GridView的'gvOutlookMeldingen'触发事件排序不处理。”如何允许排序gridview?

这是在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> 

任何帮助表示赞赏

+0

如下所述,我可以建议看看Linq to SQL。看起来这个表是使用sql填充的。使用Linq to SQL,它使得这件事更容易排序 – Neale 2011-03-18 19:34:08

+0

更好的方法是http://stackoverflow.com/questions/3966835/sorting-gridview – Sami 2013-03-18 16:12:14

回答

22

如在其他答案中所述,您在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. 
    } 
} 
+0

什么关于我使用数据表的数据源。所以我必须对这个数据表进行排序?你知不知道怎么? – SamekaTV 2011-03-18 13:28:59

+0

有几种方法可以做到这一点,我通常使用Linq出于习惯。这里有一个很好的答案:http://stackoverflow.com/questions/10855/linq-query-on-a-datatable – Kynth 2011-03-18 13:36:47

+0

如果我正在使用DataSource的文件夹中的文件,我该如何能够实现那? http://stackoverflow.com/questions/24491778/how-to-allow-sorting-in-gridview – SearchForKnowledge 2014-06-30 14:03:32

3

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

SortExpression="column name" 

在每个asp:你喜欢能够分类的Boundfield,

例如

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

我已经更新了这个问题,我做了你说的,但我仍然得到错误。 - >“GridView'gvOutlookMeldingen'触发事件排序,但未处理。” – SamekaTV 2011-03-18 13:09:16

+0

什么是gridview的数据源是它的通用列表<>,一个数据表? – bAN 2011-03-18 13:10:21

+0

它是一个数据表,我有另一个gridview,我填写的SQL的帮助 – SamekaTV 2011-03-18 13:13:43

8

此代码可以帮助(为你们谷歌上搜索这个老帖子):

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; 
} 
+0

非常有帮助。thnx – SamekaTV 2014-02-03 09:24:54

+0

方式太混乱了 – 2015-09-09 17:18:35

+0

@ChristopherBruce那是webforms for ya – drzaus 2016-05-31 15:45:33