2012-12-03 71 views
0

我想显示一个树形结构是这样的:故障显示树状结构

  • Mission1

    • 活性1
      • PROJECT1
    • 活性2
  • Mission2

    • Activity3
      • Project2的

但相反我收到重复的每个活动或项目,是不同的父元素就像一个列表这个:

  • Mission1

    • 活性1
      • PROJECT1
  • Mission1

    • 活性2

我想将一个家长('Mission')元素下的Activities和Projects分组。

这里是我的LINQ查询:

var q = from mission in _context.tMissions 
       join activity in _context.tActivities on mission.id equals activity.missionId 
       join project in _context.tDefaultEventTypes on activity.id equals project.activityId 
       where !project.isRemoved && project.defaultCategoryId == 4 
       orderby mission.name 
       select CreateFrom(project); 

     return q.ToList(); 

我然后只绑定,为一个列表,并在页面上显示。这里是我的aspx:

<asp:DataList ID="dlTierTypes" runat="server"> 
     <ItemTemplate> 
     <li><%# Eval("Activity.Mission.Name") %></li> 
      <ul> 
      <li><%# Eval("Activity.Name") %></li> 
      <ul> 
       <li><%# Eval("Name") %></li> 
      </ul> 
     </ItemTemplate> 
    </asp:DataList> 

而且后面的代码只是将其绑定:

public void SetTierTree(IEnumerable<DefaultEventType> tierList) 
    { 
     dlTierTypes.DataSource = tierList; 
     dlTierTypes.DataBind(); 
    } 

不知道如何准确地解决这个。

编辑 - 这是我在库中的新功能。

public ICollection<DefaultEventType> GetTierTree() 
    { 
     var q = from mission in _context.tMissions 
       join activity in _context.tActivities on mission.id equals activity.missionId 
       join project in _context.tDefaultEventTypes on activity.id equals project.activityId 
       where !project.isRemoved && project.defaultCategoryId == 4 
       orderby mission.name 
       select new DefaultEventType(project.tierLevel.TryParseEnum<GanttType>(GanttType.Unknown), DefaultCategoryRepository.CreateFrom(project.tDefaultCategory)) 
       { 
        //t = new DefaultEventType(project.tierLevel.TryParseEnum<GanttType>(GanttType.Unknown), DefaultCategoryRepository.CreateFrom(project.tDefaultCategory)), 
        AllowNumericSuffix = project.allowNumericSuffix, 
        AttachMilestoneMoniker = project.attachMilestoneMoniker, 
        Description = project.description, 
        Id = project.id, 
        IsReadOnly = project.isReadOnly, 
        IsSticky = project.isSticky, 
        Name = project.name, 
        Sid = project.sid, 
        Style = project.style.TryParseEnum<GanttElementStyle>(GanttElementStyle.Unknown), 
        TimeStamp = project.createdDT, 
        UpdatedTimeStamp = project.updatedDT, 
        Activity = new Activity { Id = activity.id, Name = activity.name, Mission = new Mission { Id = mission.id, Name = mission.name } } 
       }; 

     var q2 = q.GroupBy(row => row.Activity.Mission.Id) 
      .Select(group => group.GroupBy(row => row.Activity.Id)); 

     return q2.Cast<DefaultEventType>().ToList(); 
    } 

但显示的页面时,我收到此错误: '无法从类型转换'System.Collections.Generic.List 1[System.Linq.IGrouping 2 System.Int32,DefaultEventType]为键入 'DefaultEventType'。'

回答

1

首先你需要调整查询。在这个例子中使用GroupBy可以帮助很大

只要采取你所拥有的,然后按任务分组结果。对于每个小组,按活动对任务进行分组(这需要嵌套分组,而不是连续分组)。

var q2 = q.GroupBy(row => row.MissionID) 
    .Select(group => group.GroupBy(row => row.ActivityID)); 

我不确定您的提供者是否可以在数据库端执行该映射;如果不在需要的地方抛出AsEnumerable

接下来,您需要更改呈现数据的方式以反映此更改。

而不是一个DataList你需要3个嵌套的数据列表。您将整个查询绑定到显示任务的外层,然后订阅数据绑定事件以将内层组设置为内层数据列表实例的数据源。然后,在该内部数据列表中,显示活动并将最内层组绑定到最里面的DataList,这可以正常绑定项目名称。

此外,您可以考虑使用TreeView来呈现数据结构而不是DataList,因为TreeView被设计用于呈现树。我不确定是否由于某种原因需要拒绝它,或者只是没有考虑它,但它可能会更容易处理。如果你走这条路线,查询仍然会按照我的建议进行修改,那么你就不需要任何嵌套的ASP控件。

+0

在调试时,q2变量在结果视图中引发此错误:{“Method'Project CreateFrom(Project)'不支持对SQL的转换。”}它也不让我返回q2.ToList()。 – Omni

+0

@ negzero7我将你引用到我的帖子中专门讨论的部分:''我不确定你的提供者是否可以在数据库端执行该映射;如果不是在需要时在该查询中引用一个AsEnumerable。 “需要的地方”几乎可以肯定就是你们之前的所有事情以及集体旁边的事情。 – Servy

+0

忘了提及我添加了它们:var q2 = q.AsEnumerable()。GroupBy(row => row.Activity.Mission.Id) .Select(group => group.AsEnumerable()。GroupBy(row => row。 Activity.Id))AsEnumerable(); – Omni