0

次のようなツリー構造を表示したいと思います。

  • Mission1

    • アクティビティ1
      • Project1
    • アクティビティ2
  • Mission2

    • アクティビティ3
      • Project2

しかし、代わりに、次のように異なるすべてのアクティビティまたはプロジェクトの親要素を繰り返すリストを取得しています。

  • Mission1

    • アクティビティ1
      • Project1
  • Mission1

    • アクティビティ2

アクティビティとプロジェクトを1つの親(「ミッション」)要素の下にグループ化したい。

これが私の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.IGrouping2 [System.Int32、DefaultEventType]]'からタイプ'DefaultEventType'に変換できませんでした。

4

1 に答える 1

1

まず、クエリを調整する必要があります。この例では、の使用GroupBy非常に役立ちます。

あなたが持っているものを正確に取り、ミッションごとに結果をグループ化します。は、グループごとに、アクティビティごとにミッションをグループ化します(これは、順次グループごとではなく、ネストされたグループごとである必要があります)。

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

プロバイダーがDB側でそのマッピングを実行できるかどうかはわかりません。AsEnumerableそうでない場合は、必要に応じてそのクエリをスローします。

次に、この変更を反映するためにデータのレンダリング方法を変更する必要があります。

単一ではなく、DataList3つのネストされたデータリストが必要になります。クエリ全体をミッションを表示する外部レベルにバインドしてから、データバインドイベントにサブスクライブして、内部グループを内部データリストのそのインスタンスのデータソースとして設定します。次に、その内部データリストで、アクティビティを表示し、最も内側のグループレベルを最も内側DataListにバインドします。これにより、プロジェクト名を通常どおりバインドできます。

また、aはツリーをレンダリングするように設計されているため、TreeViewの代わりにを使用してデータ構造をレンダリングすることを検討してください。なんらかの理由で拒否する必要があるのか​​、それとも考慮しなかったのかはわかりませんが、おそらく作業が簡単でしょう。そのルートに進んだ場合でも、私が提案したようにクエリは変更されますが、ネストされたASPコントロールは必要ありません。DataListTreeView

于 2012-12-03T19:48:39.807 に答える