Skip to main content
All docs
V24.2

Pop-Up and Inline Edit Forms in Blazor TreeList

  • 9 minutes to read

In EditForm or PopupEditForm mode, the TreeList displays an inline or pop-up edit form instead of the edited data row. Users can click command buttons to create, modify, and delete TreeList rows.

Blazor TreeList Edit Form

Run Demo: Edit Forms

Enable Editing

The built-in edit form shows only the predefined Save and Cancel buttons. Use the EditFormTemplate to populate the edit form with editors. Call the GetEditor(String) method to add an automatically-generated column editor to the edit form.

Note

When you place a templated component in the edit form template, a Razor error may occur. To prevent this error, specify the Context parameter explicitly either for the TreeList template or for the nested component.

Once you define the edit form content, follow the steps below to enable data editing:

  1. Set the EditMode property to EditForm or PopupEditForm.
  2. If your data object has a primary key, assign it to the KeyFieldName property. Otherwise, the TreeList uses standard .NET value equality comparison to identify data items.
  3. Declare a DxTreeListCommandColumn object in the Columns template to display the command column.
  4. Handle the CustomizeEditModel event to initialize an edit model for new data rows.
  5. Handle EditModelSaving and DataItemDeleting events to save changes and reload TreeList data. Refer to the following topic for more information: Edit Model in Blazor TreeList.
  6. (Optional). Use the EditNewRootRowPosition property to display the new item row or change the position of the inline edit form displayed for new root nodes.
@inject EmployeeTaskService EmployeeTaskService

<DxTreeList Data="TreeListData"
            KeyFieldName="Id"
            ParentKeyFieldName="ParentId"
            EditMode="TreeListEditMode.EditForm"
            CustomizeEditModel="TreeList_CustomizeEditModel"
            EditModelSaving="TreeList_EditModelSaving"
            DataItemDeleting="TreeList_DataItemDeleting">
    <Columns>
        <DxTreeListCommandColumn />
        <DxTreeListDataColumn FieldName="Name" Caption="Task" />
        <DxTreeListDataColumn FieldName="EmployeeName" />
        <DxTreeListDataColumn FieldName="StartDate" />
        <DxTreeListDataColumn FieldName="DueDate" />
    </Columns>
    <EditFormTemplate Context="EditFormContext">
        <DxFormLayout CssClass="w-100">
            <DxFormLayoutItem Caption="Task:" ColSpanMd="6">
                @EditFormContext.GetEditor("Name")
            </DxFormLayoutItem>
            <DxFormLayoutItem Caption="Employee Name:" ColSpanMd="6">
                @EditFormContext.GetEditor("EmployeeName")
            </DxFormLayoutItem>
            <DxFormLayoutItem Caption="Start Date:" ColSpanMd="6">
                @EditFormContext.GetEditor("StartDate")
            </DxFormLayoutItem>
            <DxFormLayoutItem Caption="Due Date:" ColSpanMd="6">
                @EditFormContext.GetEditor("DueDate")
            </DxFormLayoutItem>
        </DxFormLayout>
    </EditFormTemplate>
</DxTreeList>

@code {
    List<EmployeeTask> TreeListData { get; set; }

    protected override void OnInitialized() {
        TreeListData = EmployeeTaskService.GenerateData();
    }
    void TreeList_CustomizeEditModel(TreeListCustomizeEditModelEventArgs e) {
        if (e.IsNew) {
            var newTask = (EmployeeTask)e.EditModel;
            newTask.Id = TreeListData.Max(x => x.Id) + 1;
            if (e.ParentDataItem != null)
                newTask.ParentId = ((EmployeeTask)e.ParentDataItem).Id;
        }
    }
    async Task TreeList_EditModelSaving(TreeListEditModelSavingEventArgs e) {
        if (e.IsNew)
            TreeListData.Add((EmployeeTask)e.EditModel);
        else
            e.CopyChangesToDataItem();
    }
    async Task TreeList_DataItemDeleting(TreeListDataItemDeletingEventArgs e) {
        TreeListData.Remove((EmployeeTask)e.DataItem);
    }
}

Customize Pop-Up Edit Form

You can set the EditMode property to PopupEditForm to display the edit form in a pop-up window. Specify the PopupEditFormCssClass property to apply a CSS class to the pop-up edit form. The PopupEditFormHeaderText property allows you to change text in the edit form header.

The following code snippet changes the pop-up edit form’s size and header text:

Blazor TreeList Popup Edit Form

<DxTreeList Data="TreeListData"
            KeyFieldName="Id"
            ParentKeyFieldName="ParentId" 
            EditMode="TreeListEditMode.PopupEditForm"
            PopupEditFormHeaderText="Edit Task"
            PopupEditFormCssClass="my-style"
            CustomizeEditModel="TreeList_CustomizeEditModel"
            EditModelSaving="TreeList_EditModelSaving"
            DataItemDeleting="TreeList_DataItemDeleting">
    <Columns>
        <DxTreeListCommandColumn />
        <DxTreeListDataColumn FieldName="Name" Caption="Task" />
        <DxTreeListDataColumn FieldName="EmployeeName" />
        <DxTreeListDataColumn FieldName="StartDate" />
        <DxTreeListDataColumn FieldName="DueDate" />
    </Columns>
    <EditFormTemplate Context="EditFormContext">
        <DxFormLayout CssClass="w-100">
            <DxFormLayoutItem Caption="Task:" ColSpanMd="6">
                @EditFormContext.GetEditor("Name")
            </DxFormLayoutItem>
            <DxFormLayoutItem Caption="Employee Name:" ColSpanMd="6">
                @EditFormContext.GetEditor("EmployeeName")
            </DxFormLayoutItem>
            <DxFormLayoutItem Caption="Start Date:" ColSpanMd="6">
                @EditFormContext.GetEditor("StartDate")
            </DxFormLayoutItem>
            <DxFormLayoutItem Caption="Due Date:" ColSpanMd="6">
                @EditFormContext.GetEditor("DueDate")
            </DxFormLayoutItem>
        </DxFormLayout>
    </EditFormTemplate>
</DxTreeList>

Hide Predefined Edit Form Buttons

Disable the EditFormButtonsVisible option to hide the predefined Save and Cancel buttons. Instead of them, you can implement your own buttons. Note the following specifics:

  • Instead of the Save button, you can use a submit button or a button that calls the SaveChangesAsync method on click.

  • To discard changes and hide the edit form, call the CancelEditAsync method in a custom button’s click event handler.

The following example displays custom Save and Cancel buttons in the edit form:

Blazor TreeList Edit Form with Custom Buttons

<DxTreeList @ref="MyTreeList"
            Data="TreeListData"
            KeyFieldName="Id"
            ParentKeyFieldName="ParentId"
            EditMode="TreeListEditMode.EditForm"
            CustomizeEditModel="TreeList_CustomizeEditModel"
            EditModelSaving="TreeList_EditModelSaving"
            DataItemDeleting="TreeList_DataItemDeleting"
            EditFormButtonsVisible="false">
    <Columns>
        <DxTreeListCommandColumn />
        <DxTreeListDataColumn FieldName="Name" Caption="Task" />
        <DxTreeListDataColumn FieldName="EmployeeName" />
        <DxTreeListDataColumn FieldName="StartDate" />
        <DxTreeListDataColumn FieldName="DueDate" />
    </Columns>
    <EditFormTemplate Context="EditFormContext">
        <DxFormLayout CssClass="w-100">
            <DxFormLayoutItem Caption="Task:" ColSpanMd="6">
                @EditFormContext.GetEditor("Name")
            </DxFormLayoutItem>
            <DxFormLayoutItem Caption="Employee Name:" ColSpanMd="6">
                @EditFormContext.GetEditor("EmployeeName")
            </DxFormLayoutItem>
            <DxFormLayoutItem Caption="Start Date:" ColSpanMd="6">
                @EditFormContext.GetEditor("StartDate")
            </DxFormLayoutItem>
            <DxFormLayoutItem Caption="Due Date:" ColSpanMd="6">
                @EditFormContext.GetEditor("DueDate")
            </DxFormLayoutItem>
            <DxFormLayoutItem ColSpanMd="12">
                <DxButton SubmitFormOnClick="true" Text="Save" />
                <DxButton Click="@(() => MyTreeList.CancelEditAsync())" Text="Cancel" />
            </DxFormLayoutItem>
        </DxFormLayout>
    </EditFormTemplate>
</DxTreeList>

This section contains comprehensive editing-related API references.

Show API References
DxTreeList API Member Type Description
CustomValidators Property Allows you to declare custom validator components.
EditFormButtonsVisible Property Specifies whether the edit form contains predefined Save and Cancel buttons.
EditFormTemplate Property Specifies the template used to display the edit form.
EditMode Property Specifies how users can edit TreeList data.
EditNewRootRowPosition Property Specifies the position of UI elements used to create new root nodes.
PopupEditFormCssClass Property Assigns a CSS class to the pop-up edit form.
PopupEditFormHeaderText Property Specifies text displayed in the pop-up edit form’s header.
ValidationEnabled Property Specifies whether the TreeList validates user input.
CancelEditAsync() Method Cancels row editing and discards changes.
GetColumnEditSettings<T>(String) Method Returns editor settings of the column bound to the specified data source field.
GetEditContext() Method Returns the edit context.
IsEditing() Method Returns whether the TreeList is being edited.
IsEditingNewRow() Method Returns whether a new TreeList row is being edited.
IsEditingRow(Int32) Method Returns whether the specified TreeList row is being edited.
SaveChangesAsync() Method Triggers validation and raises the EditModelSaving event if validation succeeds. The method immediately raises this event if validation is disabled.
ShowRowDeleteConfirmation(Int32) Method Displays the delete confirmation dialog for the specified row. If a user confirms the operation, the method raises the DataItemDeleting event.
StartEditNewRowAsync(String) Method Starts editing a new root node.
StartEditNewRowAsync(Int32, String) Method Starts editing a new child node of the row with the specified visible index.
StartEditRowAsync(Int32, String) Method Starts editing the row with the specified visible index.
CustomizeDataRowEditor Event Allows you to customize a cell editor in a data row.
CustomizeEditModel Event Allows you to customize an automatically generated edit model or create a custom edit model.
DataItemDeleting Event Fires after a user confirms the delete operation in the delete confirmation dialog.
EditCanceling Event Fires before the TreeList cancels the edit operation and discards changes.
EditModelSaving Event Fires if validation succeeds after a user saves changes or you call the SaveChangesAsync() method.
EditStart Event Fires before the TreeList starts editing a row.
DxTreeListCommandColumn API Member Type Description
CellDisplayTemplate Property Specifies a template used to display command column cells in display mode.
DeleteButtonVisible Property Specifies whether the command column displays Delete buttons.
EditButtonVisible Property Specifies whether the command column displays Edit buttons.
HeaderTemplate Property Specifies a template used to display the command column header.
NewButtonVisible Property Specifies whether the command column displays New buttons.
DxTreeListDataColumn API Member Type Description
DataRowEditorVisible Property Specifies whether to render the editor associated with this column in the column edit cell, edit form, or pop-up edit form.
EditSettings Property Allows you to customize the editor associated with this column.
ReadOnly Property Specifies whether a user can change the column editor value when the TreeList is in edit mode.