我想創建一個包含父母和孩子的專案串列。我已經在 sqlite 檔案中準備了資料:

所以我想var subjectnames = await db.SubjectNames.ToListAsync();從資料庫中讀取這些資料(我可以讀取類似的資料)并創建一個基于父母和孩子的嵌套串列。每個專案可能有一個或多個孩子,數量未知。
這是我的課:
public class SubjectName
{
public int Id { get; set; }
public long SubjectId { get; set; }
public string Name { get; set; }
public long ParentId { get; set; }
}
public class ExplorerItem : Observable
{
public enum ExplorerItemType { Folder, File, CheckMark };
public string Name { get; set; }
public ExplorerItem Parent { get; set; }
public ExplorerItemType Type { get; set; }
private ObservableCollection<ExplorerItem> m_children;
public ObservableCollection<ExplorerItem> Children
{
get
{
if (m_children == null)
{
m_children = new ObservableCollection<ExplorerItem>();
}
return m_children;
}
set
{
m_children = value;
}
}
private bool m_isExpanded;
public bool IsExpanded
{
get { return m_isExpanded; }
set { Set(ref m_isExpanded, value); }
}
}
我有一個 ExplorerItem 的 ObservableCollection:
var list = new ObservableCollection<ExplorerItem>();
必須將所有資料添加到其中
一旦資料完成,串列應該在TreeView中顯示如下

問題是我不知道如何創建父子關系并將它們添加到串列中。因為它們的數量是未知的,并且它們包括嵌套的父級和子級
uj5u.com熱心網友回復:
public List<ExplorerItem> Subjects = new List<ExplorerItem>();
private async void GetSubjects()
{
var rootItems = await db.SubjectNames.Where(x=>x.ParentId == 0).ToListAsync();
var subjectNames = await db.SubjectNames.ToListAsync();
var subjects = await db.Subjects.ToListAsync();
foreach (var root in rootItems)
{
var explorerItem = new ExplorerItem
{
Id = root.Id,
SubjectId = root.SubjectId,
Name = root.Name,
Type = ExplorerItemType.Folder
};
var subjectNameChilds = subjectNames.Where(x => x.ParentId == root.SubjectId);
if (subjectNameChilds.Any())
{
var childs = GetChilds(root, subjectNames, subjects, explorerItem);
explorerItem.Children = new ObservableCollection<ExplorerItem>(childs);
}
Subjects.Add(explorerItem);
}
}
public IEnumerable<ExplorerItem> GetChilds(SubjectName subjectName, List<SubjectName> subjectNameList, List<Subjects> subjectList, ExplorerItem parent)
{
var subjectNameChilds = subjectNameList.Where(x => x.ParentId == subjectName.SubjectId);
foreach (var root in subjectNameChilds)
{
var explorerItem = new ExplorerItem
{
Id = root.Id,
SubjectId = root.SubjectId,
Name = root.Name,
Parent = parent
};
if (root.Type == 0)
{
explorerItem.Type = ExplorerItemType.Folder;
}
else
{
var child = subjectList.Where(x => x.SubjectId == root.SubjectId).Any();
if (child)
{
explorerItem.Type = ExplorerItemType.CheckMark;
}
else
{
explorerItem.Type = ExplorerItemType.File;
}
}
var childs = subjectNameList.Where(x => x.ParentId == root.SubjectId);
if (childs.Any())
{
var chils = GetChilds(root, subjectNameList, subjectList, explorerItem);
explorerItem.Children = new ObservableCollection<ExplorerItem>(chils);
yield return explorerItem;
}
else
{
yield return explorerItem;
}
}
}
uj5u.com熱心網友回復:
如果使用 EF 可以更改類并設定配置如下:
public class SubjectName
{
public int Id { get; set; }
public long SubjectId { get; set; }
public string Name { get; set; }
public long ParentId { get; set; }
public SubjectName Parent { get; set; }
public ICollection<SubjectName> Chidren{ get; set; }
}
public class SubjectNameConfig : IEntityTypeConfiguration<SubjectName>
{
public void Configure(EntityTypeBuilder<SubjectName> builder)
{
builder.HasKey(e => e.SubjectId);
// Relations
builder.HasOne(d => d.Parent)
.WithMany(p => p.Children)
.HasForeignKey(d => d.ParentId)
.HasPrincipalKey(d => d.SubjectId)
.OnDelete(DeleteBehavior.Restrict);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/497409.html
上一篇:如何選擇屢次低分的學生?
