Get Started with Blazor TreeList
- 7 minutes to read
This tutorial describes how to create a simple Blazor application that uses a DevExpress TreeList component.
The following example contains full source code for this tutorial: Blazor TreeList - Getting Started.
Create an Application
Refer to the following section for instructions: Create an application. Make sure that resources and themes are linked correctly.
Enable Interactivity on a Page
Blazor TreeList does not support static render mode. Enable interactivity to use the component in your application. Refer to the following topic for more details: Enable Interactive Render Mode.
Prepare a Data Source
Add the
EmployeeTask
class to your project:public class EmployeeTask{ public int Id { get; set; } public int ParentId { get; set; } public string Name { get; set; } public string EmployeeName { get; set; } public DateTime StartDate { get; set; } public DateTime DueDate { get; set; } public int Progress { get; set; } public EmployeeTask() {} public EmployeeTask( int id, int parentId, string name, string employeeName, DateTime startDate, DateTime dueDate, int progress ) { Id = id; ParentId = parentId; Name = name; EmployeeName = employeeName; StartDate = startDate; DueDate = dueDate; Progress = progress; } }
Add the
EmployeeTaskService
class to your project:public class EmployeeTaskService { public List<EmployeeTask> GenerateData() { return new List<EmployeeTask>() { new EmployeeTask(1, 0, "Simplify & Clarify Product Messaging", "John Heart", new DateTime(2018, 4, 3), new DateTime(2018, 4, 14), 14), new EmployeeTask(2, 1, "Prepare Financial Reports", "Samantha Bright", new DateTime(2018, 4, 3), new DateTime(2018, 4, 7), 17), new EmployeeTask(3, 1, "Prepare Marketing Plan", "Arthur Miller", new DateTime(2018, 4, 7), new DateTime(2018, 4, 14), 11), new EmployeeTask(4, 0, "Create Action Plan To Improve Customer Engagement", "Robert Reagan", new DateTime(2017, 8, 8), new DateTime(2018, 4, 8), 23), new EmployeeTask(5, 4, "Update Personnel Files", "Greta Sims", new DateTime(2017, 8, 8), new DateTime(2017, 10, 18), 100), new EmployeeTask(6, 4, "Review Health Insurance Options ", "Brett Wade", new DateTime(2017, 9, 27), new DateTime(2017, 11, 10), 37), new EmployeeTask(7, 4, "Choose Between PPO And HMO Health Plan", "Sandra Johnson", new DateTime(2017, 12, 13), new DateTime(2018, 3, 23), 17), new EmployeeTask(8, 4, "Update Google Adwords Strategy", "Ed Holmes", new DateTime(2017, 8, 23), new DateTime(2017, 12, 23), 45), new EmployeeTask(9, 4, "Create New Brochure Design", "Barb Banks", new DateTime(2018, 1, 3), new DateTime(2018, 3, 14), 17), new EmployeeTask(10, 4, "Obtain Price Quote For New Brochure", "Kevin Carter", new DateTime(2018, 2, 1), new DateTime(2018, 3, 15), 18), new EmployeeTask(11, 4, "Brochure Design Review", "Cindy Stanwick", new DateTime(2017, 8, 22), new DateTime(2017, 10, 28), 4), new EmployeeTask(12, 4, "Review Website Re-Design Strategy", "Sammy Hill", new DateTime(2017, 9, 16), new DateTime(2018, 3, 6), 73), new EmployeeTask(13, 4, "Roll Out New Website", "Davey Jones", new DateTime(2017, 11, 7), new DateTime(2018, 2, 6), 9), new EmployeeTask(14, 4, "Update Sales/Marketing Strategy", "Victor Norris", new DateTime(2017, 12, 13), new DateTime(2018, 4, 2), 5), new EmployeeTask(15, 4, "Update Sales/Revenue Report", "Mary Stern", new DateTime(2017, 12, 25), new DateTime(2018, 4, 2), 4), new EmployeeTask(16, 4, "Direct Vs Online Sales Comparison Report", "Robin Cosworth", new DateTime(2018, 1, 2), new DateTime(2018, 3, 20), 14), new EmployeeTask(17, 4, "Review Sales Report and Approve Modifications", "Kelly Rodriguez", new DateTime(2017, 9, 4), new DateTime(2017, 10, 30), 8), new EmployeeTask(18, 4, "Update R&D Strategy", "James Anderson", new DateTime(2017, 11, 13), new DateTime(2017, 12, 4), 12), new EmployeeTask(19, 4, "Discuss Updated R&D Strategy", "Antony Remmen", new DateTime(2017, 10, 29), new DateTime(2017, 12, 31), 14), new EmployeeTask(20, 4, "Update QA Strategy", "Olivia Peyton", new DateTime(2017, 10, 31), new DateTime(2017, 11, 2), 18), new EmployeeTask(21, 4, "Schedule Training Events", "Taylor Riley", new DateTime(2017, 11, 19), new DateTime(2018, 4, 7), 21), new EmployeeTask(22, 4, "Approve The Hiring Of John Jeffers", "Amelia Harper", new DateTime(2018, 1, 7), new DateTime(2018, 4, 8), 10), new EmployeeTask(23, 0, "Increase Average Subscription Price ", "Wally Hobbs", new DateTime(2017, 8, 9), new DateTime(2017, 9, 13), 96), new EmployeeTask(24, 23, "Update Non-Compete Agreements", "Brad Jameson", new DateTime(2017, 8, 9), new DateTime(2017, 9, 3), 96), new EmployeeTask(25, 23, "Update Employee Records With New NDA", "Karen Goodson", new DateTime(2017, 8, 23), new DateTime(2018, 9, 10), 100) }; } }
Register the
EmployeeTaskService
in the Program.cs file.// ... builder.Services.AddSingleton<EmployeeTaskService>();
Add a TreeList and Bind It to Data
Add
<DxTreeList></DxTreeList>
tags to the Index.razor page.@page "/" <DxTreeList> </DxTreeList>
Inject the
EmployeeTaskService
to the page.@page "/" @inject EmployeeTaskService TaskService <DxTreeList> </DxTreeList>
In the
@code
block, declare a list ofEmployeeTask
objects. Populate this list in the OnInitialized lifecycle method.@code { List<EmployeeTask> Data { get; set; } protected override void OnInitialized() { Data = TaskService.GenerateData(); } }
Bind the Data property to the list.
<DxTreeList Data="@Data"> </DxTreeList>
Specify KeyFieldName and ParentKeyFieldName properties to build a tree structure.
<DxTreeList Data="@Data" KeyFieldName="Id" ParentKeyFieldName="ParentId"> </DxTreeList>
Refer to the following topic for more information: Bind Blazor TreeList to Data.
Add Columns
- Add five DxTreeListDataColumn objects to the Columns collection.
- Use the FieldName property to bind columns to data source fields.
Optional. Specify the following settings to customize these columns:
- Caption
- Specifies the column’s caption.
- DisplayFormat
- Specifies the format of column and summary values calculated for this column.
- Width
- Specifies the column’s width in CSS units.
- FixedPosition
- Allows you to anchor the column to the TreeList’s left or right edge.
<DxTreeList Data="@Data" KeyFieldName="Id" ParentKeyFieldName="ParentId">
<Columns>
<DxTreeListDataColumn FieldName="Name" Caption="Task" Width="40%"/>
<DxTreeListDataColumn FieldName="EmployeeName" />
<DxTreeListDataColumn FieldName="StartDate" MinWidth="100" />
<DxTreeListDataColumn FieldName="DueDate" MinWidth="100" />
<DxTreeListDataColumn FieldName="Progress" DisplayFormat="{0}%" />
</Columns>
</DxTreeList>
Sort Data
The TreeList component allows users to sort data by multiple columns. Specify SortOrder and SortIndex properties to configure initial sort settings.
<DxTreeListDataColumn FieldName="DueDate"
MinWidth="100"
SortOrder="TreeListColumnSortOrder.Ascending"
SortIndex="0" />
<DxTreeListDataColumn FieldName="Progress"
SortOrder="TreeListColumnSortOrder.Descending"
SortIndex="1" />
Filter Data
Set the ShowFilterRow property to
true
to display the filter row that allows users to filter data.Use the FilterTreeMode property to specify how the TreeList component displays filtered nodes:
Auto
(Default) – When bound to the GridDevExtremeDataSource, the component switches to theNodes
mode to improve performance. In other data binding scenarios, the TreeList operates inParentBranch
mode.ParentBranch
– The component displays a node that meets the filter criteria and all its parent nodes, even if they do not meet the criteria.Nodes
– The component ignores parent-child relationships and displays all nodes that meet the filter criteria at one level. This mode improves overall performance when the TreeList is bound to a large remote data source.EntireBranch
– The component displays a node that meets the filter criteria and all its parent and child nodes, even if they do not meet the criteria.
Specify FilterRowValue and FilterRowOperatorType properties to configure initial filter row values.
<DxTreeList Data="@Data"
KeyFieldName="Id"
ParentKeyFieldName="ParentId"
ShowFilterRow="true"
FilterTreeMode="TreeListFilterTreeMode.EntireBranch">
<Columns>
<DxTreeListDataColumn FieldName="EmployeeName"
FilterRowValue='"John"'
FilterRowOperatorType="TreeListFilterRowOperatorType.Contains" />
<!-- ... -->
</Columns>
</DxTreeList>
Add a Total Summary
Follow the steps below to display a total summary in the TreeList component:
- Add a DxTreeListSummaryItem object to the TotalSummary collection.
- Specify the item’s SummaryType and FieldName properties.
- Optional. Specify other item settings (FooterColumnName, DisplayText, and so on).
<DxTreeList Data="@Data" ... >
<TotalSummary>
<DxTreeListSummaryItem FieldName="Name" SummaryType="TreeListSummaryItemType.Count" />
<DxTreeListSummaryItem FieldName="Progress" SummaryType="TreeListSummaryItemType.Avg" />
</TotalSummary>
</DxTreeList>
Edit Data
Follow the steps below to enable data editing:
- Declare a DxTreeListCommandColumn object in the
Columns
collection. The command column displays buttons that allow users to add, edit, and delete rows. - Handle the CustomizeEditModel event to initialize an edit model for new data rows.
- Handle EditModelSaving and DataItemDeleting events to post changes to the data source.
<DxTreeList Data="@Data"
KeyFieldName="Id"
ParentKeyFieldName="ParentId"
EditModelSaving="TreeList_EditModelSaving"
DataItemDeleting="TreeList_DataItemDeleting"
CustomizeEditModel="TreeList_CustomizeEditModel" ...>
<Columns>
<DxTreeListCommandColumn Width="200px"/>
@* ... *@
</Columns>
</DxTreeList>
@code {
List<EmployeeTask> Data { get; set; }
void TreeList_CustomizeEditModel(TreeListCustomizeEditModelEventArgs e) {
if(e.IsNew) {
var newTask = (EmployeeTask)e.EditModel;
newTask.Id = Data.Max(x => x.Id) + 1;
if(e.ParentDataItem != null)
newTask.ParentId = ((EmployeeTask)e.ParentDataItem).Id;
}
}
async Task TreeList_EditModelSaving(TreeListEditModelSavingEventArgs e) {
if(e.IsNew)
Data.Add((EmployeeTask)e.EditModel);
else
e.CopyChangesToDataItem();
}
async Task TreeList_DataItemDeleting(TreeListDataItemDeletingEventArgs e) {
Data.Remove((EmployeeTask)e.DataItem);
}
protected override void OnInitialized() {
Data = EmployeeTaskService.GenerateData();
}
}
Refer to the following topic for more information: Editing and Validation in Blazor TreeList.
More Features
For more information about TreeList features, refer to the following root topic: Blazor TreeList.