2011-03-18 61 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