2013-09-28 39 views
0

這裏的相對新手。發現我必須編寫一個事件處理程序來處理來自objectdatasource的數據排序。發現了很多對代碼的引用,如下所示,但是當代碼運行時,我收到消息「找不到列xxx」,其中xxx是我嘗試排序的列的名稱。排序gridview - 找不到列

我已驗證e.SortExpression正在返回正確的列名稱,但問題似乎在下面的第二行,我嘗試從GridView1.Datasource創建一個數據表(dt)。在這個語句之後dt的值是'Nothing',所以其餘的代碼失敗。

此外,我列出了大部分的gridview定義,以防有用。

Protected Sub GridView1_Sorting(sender As Object, e As GridViewSortEventArgs) Handles GridView1.Sorting 
    Dim dt As Data.DataTable = New Data.DataTable(GridView1.DataSource) 
    If Not dt Is Nothing Then 
     dt.DefaultView.Sort = e.SortExpression 
     GridView1.DataSource = dt 
     GridView1.DataBind() 
    End If 
End Sub 

ASPX片段:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
     DataSourceID="ObjectDataSource1" CellPadding="4" 
     EmptyDataText="No records found for your search" ForeColor="#333333" 
     GridLines="None" Width="930px" BorderColor="#CCCCCC" Font-Size="12px" AllowSorting="True"> 
     <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> 
     <Columns> 
      <asp:BoundField DataField="CustName" HeaderText="CustName" 
       SortExpression="CustName" /> 
      <asp:BoundField DataField="CustType" HeaderText="CustType" 
       SortExpression="CustType" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" /> 
      <asp:TemplateField HeaderText="Address" SortExpression="Addr1"> 
       <ItemTemplate> 
        <asp:Label ID="Label1" runat="server" Text='<%# Bind("Addr1") %>'></asp:Label> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Addr1") %>'></asp:TextBox> 
       </EditItemTemplate> 
      </asp:TemplateField> 
      <asp:BoundField DataField="Phone" HeaderText="Phone" SortExpression="Phone" /> 
      <asp:BoundField DataField="ContactName" HeaderText="ContactName" 
       SortExpression="ContactName" /> 
      <asp:BoundField DataField="LastContactDate" HeaderText="LastContact" SortExpression="LastContactDate" dataformatstring="{0:d}" /> 
      <asp:BoundField DataField="CustSince" HeaderText="CustSince" 
       SortExpression="CustSince" dataformatstring="{0:MM/dd/yyyy}" /> 
      <asp:BoundField DataField="Status" HeaderText="Status" 
       SortExpression="Status" ItemStyle-HorizontalAlign="Center" HeaderStyle-HorizontalAlign="Center" /> 
      <asp:BoundField DataField="Source" HeaderText="Source" 
       SortExpression="Source" /> 
      <asp:BoundField DataField="RelMgr" HeaderText="RelMgr" 
       SortExpression="RelMgr" /> 
      <asp:TemplateField HeaderText="RelMgrInfo"> 
       <ItemTemplate> 
        <asp:HyperLink ID="RelMgrEmailLink" runat="server" NavigateUrl='<%#Eval("RelMgrEmail", "mailto:{0}")%>' Text='<%# Eval("RelMgrEmail") + "<br>" + Eval("RelMgrPhone")%> '> </asp:HyperLink> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 

謝謝!

回答

0

如果使用ObjectDataSource,則不必處理排序事件。相反,設置SortParameterName爲一個字符串(如「排序依據」),並增加你的業務方法簽名的ObjectDataSource使用與該參數檢索數據:

public IEnumerable<Whatever> Retrieve(string OrderBy, ... other arguments) ... 

該網格將參數值傳遞給消耗臭氧層物質,然後ODS會傳遞給你的方法。

+0

Wiktor,我明白你在說什麼,但無法讓它工作。我向添加了一個參數,然後在ODS的SortParameterName中引用該參數,最後在我的SELECT方法語句中添加了一個相應的參數。但是因爲我在代碼隱藏中註釋了我的排序方法,所以我現在得到一個錯誤:「GridView'GridView1'觸發了事件排序,但沒有處理」,這首先讓我開始了這條路。 – Ryk

+0

首先,通過將EnableSorting設置爲true來啓用網格視圖排序。然後,將排序參數名稱添加到對象數據源。然後,刪除排序事件處理程序,你不需要它。如果你仍然有麻煩,請告訴我,我會指出你一個工作的例子。 –

+0

是的,我已經完成了所有這些事情,Wiktor。我可以使用這個例子。謝謝! – Ryk