FireMonkey如何删除与ListView项绑定的数据库记录并避免参数越界错误
问题原因
报错的核心是删除操作重复执行:当你在
ListView1DeletingItem事件中删除数据集记录时,LiveBinding会自动同步移除ListView对应的绑定项,事件执行结束后,ListView的默认删除逻辑还会尝试按触发删除时的索引删除已经不存在的项,因此抛出Argument out of range错误。
解决方案
最简单的修复方式是在删除数据集记录后,禁用ListView的默认删除逻辑即可,不需要解绑或关闭数据集:
procedure TPassPlus.ListView1DeletingItem(Sender: TObject; AIndex: Integer; var ACanDelete: Boolean); var myDBID: string; begin // 直接通过事件传入的AIndex获取待删除项,避免左滑删除时Selected与当前操作项不一致的问题 myDBID := ListView1.Items[AIndex].Tag.ToString; if DB_Table.Locate('DBID', myDBID, []) then DB_Table.Delete; // 禁止ListView自带的删除逻辑,LiveBinding已完成UI同步 ACanDelete := False; end;
补充说明
- 你之前尝试的关闭数据集、停用绑定的操作会打断LiveBinding的正常同步逻辑,反而会触发UI更新异常,不需要执行这类操作。
- LiveBinding本身支持UI与数据集的双向同步,本次问题不属于LiveBinding的功能缺陷,只是ListView原生左滑删除逻辑没有和绑定逻辑自动适配,仅需添加一行
ACanDelete := False即可解决。
内容的提问来源于stack exchange,提问作者Haizhou
相关产品推荐
相关产品推荐

