0

这里的相对新手。发现我必须编写一个事件处理程序来处理来自 objectdatasource 的数据排序。找到很多对代码的引用,如下所示,但是当代码运行时,我收到消息“找不到列 xxx ”,其中 xxx 是我要排序的列的名称。

我已经验证 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>

谢谢!

4

1 回答 1

0

如果您使用 ObjectDataSource,则不必处理排序事件。相反,将 SortParameterName 设置为字符串(如“OrderBy”)并增加 ObjectDataSource 用于通过此参数检索数据的业务方法签名:

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

网格会将参数值传递给 ODS,然后 ODS 会将其传递给您的方法。

于 2013-10-02T15:53:24.640 回答