【问题标题】:RadGrid overrides EntityDataSource SortingRadGrid 覆盖 EntityDataSource 排序
【发布时间】:2012-12-20 14:12:54
【问题描述】:

事前:

我正在使用一个无法更改的静态数据库,因为它被外部软件使用。

如果不是“1”或“6”,我将数据库值从 StatusTypeId 映射到介于这些值之间的值。 背景:支持票务系统

客户应该只能看到 StatusTypeIds 1、3 和 6。 1(开放),3(工作中),6(关闭)

所以我手动更改了网格值,现在正在进行正确的排序。

在 EntityDataSource 上执行的初始排序表达式工作正常,直到使用网格的排序功能。那么,不管是我手动截取的,排序都做错了。

EntityDataSource 的初始排序:

<asp:EntityDataSource ID="DefectsDataSource" runat="server" 
ConnectionString="name=*" DefaultContainerName="*" 
EnableFlattening="False" EntitySetName="Defects" Select="it.[DefectId], it.[Name], it.[StatusTypeId]"  
OrderBy="(CASE WHEN it.[StatusTypeId] <> 1 AND it.[StatusTypeId] <> 6 THEN 2 ELSE it.[StatusTypeId] END)"/>

是否可以从 Grid(SortCommand 事件)中获取请求的排序顺序并将 EntityDataSource 的 OrderBy 属性设置为正确排序? 我试过了,但它被忽略了。

SortCommand事件的实现:

    protected void SortCommand(object sender, GridSortCommandEventArgs e)
    {
        if (e.SortExpression == "StatusTypeId")
        {
            string sortExpression = (e.NewSortOrder == GridSortOrder.Ascending) ? "ASC" : e.NewSortOrder == GridSortOrder.Descending ? "DESC" : "";
            this.DefectsDataSource.OrderBy = string.Format("(CASE WHEN it.[StatusTypeId] <> 1 AND it.[StatusTypeId] <> 6 THEN 2 ELSE it.[StatusTypeId] END) {0}", sortExpression);
            this.RadGrid.Rebind();
        }
    }

我希望有足够的信息来帮助我。如果我错过了什么,请问我。

【问题讨论】:

    标签: c# asp.net sorting telerik radgrid


    【解决方案1】:

    我已经解决了这个问题,通过使用 ObjectContext.Entity.ToList()[.OrderBy()] 手动设置来自 RadGrid 的 DataSource 并对反射和属性映射进行手动排序:

    public static Dictionary<string, PropertyInfo> ColumnMapper = new Dictionary<string, PropertyInfo>
                                                                       {
                                                                           {"StatusTypeId", typeof(Defects).GetProperty("CustomerStatus*") },
                                                                           {"DefectId", typeof(Defects).GetProperty("DefectId") },
                                                                           {"Name", typeof(Defects).GetProperty("Name") }
                                                                       }; 
    
    * Thats the Custom Column from above.
    

    将 MasterTemplateView.AllowCustomSorting 设置为 True 并使用以下代码在 Page_Load() 和 SortCommand 上排序:

    protected new void Page_Load(object sender, EventArgs e)
    {
       var exp = this.RadGrid.MasterTableView.SortExpressions; 
       if (exp.Count == 0)
       {
          this.SortGrid(new GridSortExpression { FieldName = "DefectId", SortOrder = GridSortOrder.Ascending});
       }
       else
       {
          this.SortGrid(exp[0]);
       }
    }
    
    protected void SortCommand(object sender, GridSortCommandEventArgs e)
    {
        this.SortGrid(new GridSortExpression { FieldName = e.SortExpression, SortOrder = e.NewSortOrder });
    }
    
    private void SortGrid(GridSortExpression e)
    {
        IOrderedEnumerable<Defects> bindingList = null;
        var defects = DataAccessLayer.GetLoadedSet<Defects>().ToList();
        if (Defects.ColumnMapper.ContainsKey(e.FieldName))
        {
            var prop = Defects.ColumnMapper[e.FieldName];
            switch (e.SortOrder)
            {
            case GridSortOrder.Ascending:
                bindingList = defects.OrderBy(src => prop.GetValue(src, null));
                break;
            case GridSortOrder.Descending:
                bindingList = defects.OrderByDescending(src => prop.GetValue(src, null));
                break;
            case GridSortOrder.None:
                bindingList = defects.OrderBy(src => src.DefectId);
                break;
            }
        }
        this.RadGrid.DataSource = bindingList;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2018-09-27
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多