【问题标题】:Sorting Issue with User defined datatypes (Custom Properties) in C#C# 中用户定义的数据类型(自定义属性)的排序问题
【发布时间】:2014-07-31 11:20:11
【问题描述】:

我有一个网格,我在其中从一个对象中获取数据。对象有一些复杂的数据类型。下面是我的代码能够排序 ORDERID 和 OrderNumber 但不是 CustomerInfo 属性

类:

public class Order
{    
    public Int32 OrderID{ get; set; }
    public String OrderNumber { get; set; }        
    public Customer CustomerInfo { get; set;}
}

public class Customer
{
    public Int64 CustomerNumber { get; set; }
    public String FirstName { get; set; }
    public String  LastName { get; set; }
    public String Phone { get; set; }
}

我的前端网格定义了列,其中一列是

<asp:TemplateField HeaderText="Last Name"  ItemStyle-Width="15%" SortExpression="OrderCustomerInfo.LastName">
    <ItemTemplate>
        <%# Eval("OrderCustomerInfo.LastName") %>
    </ItemTemplate>
</asp:TemplateField>

当我传递排序表达式时:OrderCustomerInfo.LastName 它无法识别下面的列是我的排序函数,我收到错误 -

实例属性 'OrderCustomerInfo.LastName' 没有为类型 'Order' 定义 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentException:实例属性 'OrderCustomerInfo.LastName' 没有为类型 'Order' 定义)

错误行 -- 表达式属性 = Expression.Property(param, columnName); // x.ColumnName

public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> collection, string columnName, SortDirection direction)
{
    ParameterExpression param = Expression.Parameter(typeof(T), "x"); // x
    Expression property = Expression.Property(param, columnName);     // x.ColumnName
    Func<T, object> func = Expression.Lambda<Func<T, object>>(        // x => x.ColumnName
    Expression.Convert(Expression.Property(param, columnName),
    typeof(object)), param).Compile();

    Func<IEnumerable<T>, Func<T, object>, IEnumerable<T>> expression =
        SortExpressionBuilder<T>.CreateExpression(direction);
    IEnumerable<T> sorted = expression(collection, func);

    return sorted;
}

【问题讨论】:

  • 应该是OrderCustomerInfo.LastName还是Order.CustomerInfo.LastName
  • @Powerlord 不,我已经尝试过了,我得到了同样的错误——消息:“实例属性 'Order.CustomerInfo.LastName' 没有为类型 'Order' 定义”
  • 你的OrderCustomerInfoLastName 属性吗?
  • @rageit,是的,我有,并且我将 OrderCustomerInfo.LastName 绑定到网格列

标签: c# linq object gridview-sorting columnsorting


【解决方案1】:

问题不在于这一行吗:

<%# Eval("OrderCustomerInfo.LastName") %>

缺少一个.?

<%# Eval("Order.CustomerInfo.LastName") %>

【讨论】:

  • 不,我正在绑定从数据访问返回的对象,该对象将使用这些类...对象名称是 OrderCustomerInfo,需要绑定的属性是 LastName,所以它是 OrderCustomerInfo.LastName
  • 将其更改为 CustomerInfo.LastName 是否有效?在我看来,OrderCustomerInfo 是一个 List。我是一个工作,所以我不能尝试这个,但我觉得你的函数也需要修改以处理复杂的对象。乍一看,它似乎不会处理嵌套属性
  • 不,它不起作用....它适用于常规属性,但不适用于自定义属性..
【解决方案2】:

异常声明:

异常详细信息:System.ArgumentException:实例属性 'OrderCustomerInfo.LastName' 没有为类型 'Order' 定义)

所以我认为您需要将SortExpressionEval 更新为:

<asp:TemplateField HeaderText="Last Name"  ItemStyle-Width="15%" SortExpression="CustomerInfo.LastName">
    <ItemTemplate>
        <%# Eval("CustomerInfo.LastName") %>
    </ItemTemplate>
</asp:TemplateField>

【讨论】:

  • 我已按照我之前的 commnets 中所述进行了更新....它没有工作..可能我需要调整 OrderBy 功能以支持复杂类型..
猜你喜欢
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多