如何在自定义SfDialog确认后调用Syncfusion Grid的BeforeSave方法
问题解决:Syncfusion SfGrid自定义确认对话框后批量保存异常处理
在使用Syncfusion SfGrid批量编辑模式时,自定义确认对话框替代默认更新确认后,手动调用BeforeSave方法因传入的参数无真实变更数据导致异常,以下是两种可行的解决方案:
核心问题分析
你手动实例化BeforeBatchSaveArgs<Role>()时,该对象的BatchChanges属性为null,因此访问args.BatchChanges.ChangedRecords会直接抛出空引用异常。正确的做法是让Grid自身触发批量保存流程,或直接从Grid获取真实的变更数据。
方案1:确认后触发Grid原生批量保存(推荐)
取消手动调用BeforeSave方法,转而在确认后调用Grid的BatchSaveAsync(),让Grid自动触发OnBatchSave事件,此时传入的参数会包含完整的变更数据。
- 确保Grid引用已正确定义(你已完成此步骤):
<SfGrid @ref="Grid" DataSource="@GridData" AllowPaging="true" AllowSorting="true" Toolbar="@(new List<string>() {"Add","Update", "Cancel","Delete","Search"})" Height="250"> <GridEditSettings AllowEditing="true" AllowAdding="true" AllowDeleting="true" ShowConfirmDialog="false" Mode="EditMode.Batch"></GridEditSettings> <GridPageSettings PageSizes="@(new string[] {"5", "10", "15", "All" })" PageSize="5"></GridPageSettings> <GridEvents TValue="Role" OnToolbarClick="ToolbarClickHandler" OnBatchSave="BeforeSave"></GridEvents> <GridColumns> <!-- 列配置 --> </GridColumns> </SfGrid>
- 修改
OkClick方法:
private async Task OkClick() { if (DialogUpdate != null) { await DialogUpdate.HideAsync(); // 触发Grid原生批量保存,自动传入有效参数给BeforeSave await Grid.BatchSaveAsync(); } }
- 保留原
BeforeSave方法不变,此时args会包含真实的变更数据:
public async Task BeforeSave(BeforeBatchSaveArgs<Role> args) { var changedRecords = args.BatchChanges.ChangedRecords; // 正常获取变更数据 // 执行数据库保存逻辑 }
方案2:直接从Grid获取变更数据自行处理
若不需要依赖Grid的OnBatchSave事件,可直接通过Grid的GetBatchChanges()方法获取所有变更记录,自行处理保存逻辑:
修改OkClick方法:
private async Task OkClick() { if (DialogUpdate != null) { await DialogUpdate.HideAsync(); // 直接从Grid获取批量变更数据 var batchChanges = Grid.GetBatchChanges(); var changedRecords = batchChanges.ChangedRecords; var addedRecords = batchChanges.AddedRecords; var deletedRecords = batchChanges.DeletedRecords; // 分别处理新增、修改、删除的数据库操作 // ... // 保存完成后清除Grid的变更状态 await Grid.ClearBatchChangesAsync(); } }
额外提示
你对话框的提示文本为德语“Sind Sie sicher, dass Sie die Änderungen rückgängig machen wollen?”(是否撤销更改),与更新操作语义不符,建议修改为对应确认保存的文本,例如“确定要保存这些更改吗?”
内容的提问来源于stack exchange,提问作者Jorgetryingsomething
相关产品推荐
相关产品推荐

