syncfusion-blazor-treegrid — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited syncfusion-blazor-treegrid (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The Syncfusion Blazor TreeGrid (SfTreeGrid<TValue>) renders hierarchical data in a tabular format with expand/collapse rows. It supports self-referential flat data (IdMapping/ParentIdMapping) and nested child collections, combined with a full suite of grid features including editing, filtering, sorting, virtualization, and export.
GraphQLAdaptorTrigger keywords: TreeGrid, Tree Grid, SfTreeGrid, hierarchical grid, parent-child grid, IdMapping, ParentIdMapping, tree data table, nested grid rows, Syncfusion Blazor tree, GraphQL TreeGrid, GraphQLAdaptor TreeGrid
These rules govern how this skill MUST behave. They are mandatory and must be strictly followed.
Your responsibility is to interpret any natural‑language user request and provide accurate, complete, and validated information about all supported aspects of the Syncfusion Blazor TreeGrid, including:
The Skill MUST:
If a feature is not supported: clearly state the limitation and suggest a supported alternative when possible.
When user requests are incomplete:
If the user asks for an unsupported capability:
The Skill MUST follow Syncfusion official patterns, including:
SfTreeGrid, TreeGridColumn, TreeGridEditSettings, TreeGridEvents, etc.)The Skill MUST:
The Skill MUST NOT:
If unsure: ask for clarification OR clearly state the limitation.
CRITICAL: Event names MUST be verified against references/events.md BEFORE providing code examples. All tree grid events MUST be defined inside the <TreeGridEvents> component
Common Mistakes to Avoid:
OnSortChange — Does NOT exist. Use Sorting, Sorted insteadOnFilterChange — Does NOT exist. Use Filtering, Filtered insteadRule: ALWAYS cross-reference references/events.md for:
Before generating any code, identify every feature in the request and read the reference file for each one. The snippets in this file are abbreviated — they omit critical rules and known pitfalls. Reference files are the authoritative source.
⚠️ Read ALL reference files that apply — not just the one most obvious from the query.
Rule 1: Always use full namespace qualification to avoid CS0104 "ambiguous reference" errors. Types exist in both Syncfusion.Blazor.TreeGrid and Syncfusion.Blazor.Grids namespaces.
Rule 2: Always include @using Syncfusion.Blazor.Grids; in _Imports.razor or component to prevent CS0103 "missing reference" errors for:
ActionEventArgs, RowDataBoundEventArgs, BeforeCopyPasteEventArgs, etc.)Action enum (Action.Sorting, Action.Save, etc.)TreeGridPageSettings, TreeGridFilterSettings, TreeGridSelectionSettings, etc.)Rule 3: The following event arg types belong to Syncfusion.Blazor.TreeGrid — add @using Syncfusion.Blazor.TreeGrid; (NOT Syncfusion.Blazor.Grids):
RowExpandingEventArgs<TValue>, RowExpandedEventArgs<TValue>RowCollapsingEventArgs<TValue>, RowCollapsedEventArgs<TValue>CheckBoxChangeEventArgs<TValue>Type Reference:
| Type | Namespace | Example |
|---|---|---|
| FilterType | TreeGrid | Syncfusion.Blazor.TreeGrid.FilterType.Excel |
| EditMode | TreeGrid | Syncfusion.Blazor.TreeGrid.EditMode.Row |
| CopyHierarchyType | TreeGrid | Syncfusion.Blazor.TreeGrid.CopyHierarchyType.Both |
| Action | Grids | Syncfusion.Blazor.Grids.Action.Save |
| TextAlign | Grids | Syncfusion.Blazor.Grids.TextAlign.Right |
| ColumnType | Grids | Syncfusion.Blazor.Grids.ColumnType.Date |
| EditType | Grids | Syncfusion.Blazor.Grids.EditType.DatePickerEdit |
| SelectionMode | Grids | Syncfusion.Blazor.Grids.SelectionMode.Row |
| SelectionType | Grids | Syncfusion.Blazor.Grids.SelectionType.Multiple |
| ClipMode | Grids | Syncfusion.Blazor.Grids.ClipMode.Ellipsis |
| GridLine | Grids | Syncfusion.Blazor.Grids.GridLine.Horizontal |
| AggregateType | Grids | Syncfusion.Blazor.Grids.AggregateType.Sum |
| CellSelectionMode | Grids | Syncfusion.Blazor.Grids.CellSelectionMode.Box |
<SfTreeGrid DataSource="@TreeData"
IdMapping="TaskId"
ParentIdMapping="ParentId"
TreeColumnIndex="1"
AllowSorting="true"
AllowFiltering="true"
AllowPaging="true">
<TreeGridColumns>
<TreeGridColumn Field="TaskId" HeaderText="ID" Width="80" IsPrimaryKey="true" />
<TreeGridColumn Field="TaskName" HeaderText="Task Name" Width="200" />
<TreeGridColumn Field="Duration" HeaderText="Duration" Width="100" />
<TreeGridColumn Field="Progress" HeaderText="Progress" Width="100" />
</TreeGridColumns>
</SfTreeGrid>Key concepts:
IdMapping — property name that uniquely identifies each rowParentIdMapping — property name pointing to the parent row's ID (null/0 = root)TreeColumnIndex — column index that shows the expand/collapse icon (0-based)_Imports.razor, Program.cs, theme/script setup, basic grid, IdMapping/ParentIdMapping/TreeColumnIndex, expand-collapse all, OnActionFailureSfDataManager, load on demandDataAdaptor override, Read/ReadAsync, Insert/Update/Delete, paging & sorting support, self-referential onlyGraphQLAdaptor, GraphQLAdaptorOptions, DataManagerRequestInput, CRUD mutations, cascading delete, CORSColumnType, Format, TextAlign, frozen, reorder, resize, chooser, stacked headers, column menu, foreign keyQueryCellInfo, CustomAttributes, ClipMode, GridLines, tooltipsAllowSorting, multi-sort, SortComparer, SortColumnAsync, ClearSortingAsync, hierarchy preservedAllowFiltering, FilterType (FilterBar/Menu/Excel/CheckBox), hierarchy modes, operators, FilterByColumnAsync. ⚠️ See filtering.md for FilterTemplate rulesSearchAsync, GridSearchSettings, hierarchy modes, highlight/clearValidationRules. Always add @using Syncfusion.Blazor.Grids when using <TreeGridEvents>RowDataBound, row/detail template, drag-and-drop, row height, row spanningAllowPaging, TreeGridPageSettings, PageSize, pager position/template, programmatic navigationEnableVirtualization, EnableColumnVirtualization, vs. paging, limitationsEnableToolbarItemsAsync, OnToolbarClickContextMenuItems, custom items, ContextMenuItemClicked, conditional show/hideExportToExcelAsync, ExportToPdfAsync, PrintAsync, custom data/headers, themesFrozenRows, IsFrozen, FreezeDirection), AllowFreezeLineMoving, EnableStickyHeader, ScrollIntoViewAsyncTreeGridAggregateColumn (Field+Type required), AggregateType, FooterTemplate, ShowChildSummary, custom LINQ, page-scope limitationCopyAsync, paste (Box+Batch), CopyHierarchyMode, BeforeCopyPasteEnableAutoFill + Cell/Box selection + Batch edit, limitationsEnableAdaptiveUI, full-screen dialogs, vertical row modeEnablePersistence, persisted properties, manual state methodsTreeGridEvents<TValue>, OnActionBegin/OnActionComplete, RowDataBound, QueryCellInfo, cancel actions1. Install NuGet: Syncfusion.Blazor.TreeGrid
2. Register in `_Imports.razor`:
@using Syncfusion.Blazor
@using Syncfusion.Blazor.TreeGrid3. Add CSS in `wwwroot/index.html` or `App.razor`:
<link href="_content/Syncfusion.Blazor.Themes/material.css" rel="stylesheet" />4. Add to `Program.cs`:
builder.Services.AddSyncfusionBlazor();5. Minimal component:
@using Syncfusion.Blazor.TreeGrid
<SfTreeGrid DataSource="@TreeData" IdMapping="Id" ParentIdMapping="ParentId" TreeColumnIndex="1">
<TreeGridColumns>
<TreeGridColumn Field="Id" HeaderText="ID" Width="80" IsPrimaryKey="true" />
<TreeGridColumn Field="Name" HeaderText="Name" Width="200" />
<TreeGridColumn Field="Status" HeaderText="Status" Width="120" />
</TreeGridColumns>
</SfTreeGrid>
@code {
public class TaskItem
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Name { get; set; }
public string Status { get; set; }
}
private List<TaskItem> TreeData = new()
{
new TaskItem { Id = 1, ParentId = null, Name = "Project Alpha", Status = "In Progress" },
new TaskItem { Id = 2, ParentId = 1, Name = "Design Phase", Status = "Done" },
new TaskItem { Id = 3, ParentId = 1, Name = "Development", Status = "In Progress" },
new TaskItem { Id = 4, ParentId = 3, Name = "Backend API", Status = "Pending" },
};
}<SfTreeGrid @ref="TreeGridRef"
DataSource="@TreeData"
IdMapping="Id"
ParentIdMapping="ParentId"
TreeColumnIndex="1"
AllowSorting="true"
AllowFiltering="true"
AllowPaging="true"
Toolbar="@(new List<string> { "Add", "Edit", "Delete", "Update", "Cancel" })">
<TreeGridEditSettings AllowAdding="true"
AllowEditing="true"
AllowDeleting="true"
Mode="Syncfusion.Blazor.TreeGrid.EditMode.Row" />
<TreeGridPageSettings PageSize="10" />
<TreeGridColumns>
<TreeGridColumn Field="Id" IsPrimaryKey="true" Visible="false" />
<TreeGridColumn Field="Name" HeaderText="Task" Width="220" />
<TreeGridColumn Field="Duration" HeaderText="Days" Width="100" />
<TreeGridColumn Field="Progress" HeaderText="%" Width="100" />
</TreeGridColumns>
</SfTreeGrid>
@code {
private SfTreeGrid<TaskItem> TreeGridRef;
// ... data and model
}<SfTreeGrid @ref="TreeGridRef" AllowExcelExport="true" AllowPdfExport="true"
Toolbar="@(new List<string> { "ExcelExport", "PdfExport" })">
<TreeGridEvents TValue="TaskItem" OnToolbarClick="ToolbarClickHandler" />
...
</SfTreeGrid>
@code {
private SfTreeGrid<TaskItem> TreeGridRef;
private async Task ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args)
{
if (args.Item.Id.Contains("excelexport"))
await TreeGridRef.ExportToExcelAsync();
else if (args.Item.Id.Contains("pdfexport"))
await TreeGridRef.ExportToPdfAsync();
}
}~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.