2016-02-05 3 views
0

У привязки модели много преимуществ и экономит много времени, когда вы хотите бросить некоторые данные в gridview на странице и получить ее и бег быстро. Например, я могу иметь этот класс EmployeeСортировка GridView для свойства навигации, использующего привязку модели в ASP.NET 4.5

public class Employee 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Job> Jobs { get; set; } 
    [NotMapped] 
    public Job CurrentJob 
    { 
     get { return Jobs.OrderByDescending(x => x.StartDate).FirstOrDefault(); } 
    } 

Я бросаю это в GridView с использованием модели Binding и поле шаблона для вычисленного объекта:

<asp:GridView runat="server" id="gvDataItemType" ItemType="Model.Employee" SelectMethod="Select" AllowSorting="True"> 
    <Columns>    
     <asp:DynamicField DataField="Name"/> 
     <asp:DynamicField DataField="Email"/>  
     <asp:TemplateField HeaderText="Job" SortExpression="???"> 
      <ItemTemplate> 
       <asp:Label ID="lblJobTitle" Text='<%# Bind("CurrentJob.JobName") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     ... 

со следующим Выбор метода в коде позади:

public IQueryable<Employee> Select() 
{ 
    MyContext context = new MyContext(); 
    return context.Employees; 
}  

Все виды чудесно за исключением, очевидно, свойства CurrentJob.JobName.

Мой вопрос: Как я могу сортировать GridView в свойстве CurrentJob.JobName?

ответ

0

Я думаю, что могу ответить на мой собственный вопрос. Я добавил уникальное выражение сортировки в шаблон поля, которые не соответствуют с существующим выражением сортировки:

<asp:TemplateField HeaderText="Job" SortExpression="MeaninglessSortExpression"> 
      <ItemTemplate> 
       <asp:Label runat="server" ID="lblJobTitle" Text='<%# Bind("CurrentJob.Job.JobName") %>'></asp:Label> 

, а затем я обнаружил, что SelectMethod в GridView будет искать аргумент, как это:

Select(string sortByExpression) 

Тогда я просто бросил некоторую условную логику прямо в мой метод выбора. Нет необходимости даже иметь дело с OnSorting или что-нибудь подобное:

public IQueryable<Employee> Select(string sortByExpression) 
    { 
     MyContext context = new MyContext(); 
     if (sortByExpression == "MeaninglessSortExpression") 
     {     
      return context.Employees.OrderBy(x => x.Jobs.OrderByDescending(y => y.StartDate).FirstOrDefault().Job.JobName); 
     } 

Это немного многословным, но я не мог запустить LinqQuery на основе х => x.CurrentJob, так как это рассчитывается свойство. Так или иначе, это сработало. Мне даже не нужно вручную вызывать DataBind(); Единственное ограничение в том, что это, очевидно, перекрывает функциональность сортировки по умолчанию, так что вы можете воспроизвести его, как это:

else 
{ 
return context.employees.SortBy(sortByExpression); 

Это было также полезно: ASP.Net 4.5 Model Binding Sorting By Navigation Property

0

Я не использую Entity Framework, чтобы получить мои данные, но Я использовал общее решение для сравнения, подобное этому, для обработки сортировки по бизнес-объектам ... http://www.davidgiard.com/2008/06/26/SortingAGridViewBoundToAGenericList.aspx

Я скорректировал метод сравнения класса GenericComparer, чтобы он мог обрабатывать нулевые свойства, но кроме этого я реализовал это в нескольких проектах.

+0

Интересно ... Спасибо. Это также может быть полезно. – Mike

 Смежные вопросы

  • Нет связанных вопросов^_^