2012-12-20 39 views
1

事前:radgrid控件覆蓋EntityDataSource排序

我用一個靜態的數據庫,這是不能改變的工作,因爲它使用外部軟件。

如果StatusTypeId中的數據庫值不是「1」或「6」,則將其映射到位於這些值之間的值。 背景:Supportticketsystem

的客戶應只看到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)"/> 

有可能獲得來自電網(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(); 
     } 
    } 

我希望有足夠的信息來幫助我。如果我錯過了什麼,請問我。

回答

0

我已經解決了這個問題,通過用ObjectContext.Entity.ToList()手動地從radgrid控件設定DataSource和作出人工分揀過反射和屬性映射[的OrderBy()。]:

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; 
}