GridControl里单元格看着已经改了,点【保存】却没有落库,最常见的根因不是数据库更新失败,而是编辑值还停在编辑器里,没有真正提交到行数据与数据源。排查时把链路按提交层级拆开,从编辑器提交到行提交,再到数据源状态与落库调用,一层层核对,往往比直接盯着SQL更快收敛。
一、DevExpress GridControl编辑后不保存怎么排查
这类问题建议按编辑器、行、数据源、落库四层逐级缩小范围,先确认提交动作是否发生,再确认提交后的对象是否就是你以为的那条数据。
1、提交编辑器
用户编辑完不离开单元格就点【保存】时,最后一次输入可能还没写回行数据,保存逻辑读取到的仍是旧值。处理思路是把保存按钮的第一步固定为提交当前编辑器,再继续后续保存流程,避免把未提交的编辑态当成已修改。
2、提交当前行
不少项目把更新写在行提交之后触发的链路里,如果当前行没有被提交,行更新相关流程就不会进入。排查时要确认保存动作是否显式触发行提交,尤其是用户没有切行、没有失焦的场景,否则会出现“只有最后一格不保存”的典型现象。
3、检查行校验
启用了行校验后,校验失败会阻止提交或让网格保持在编辑态,用户体感像是点了【保存】没反应。需要重点看行校验里是否把行判为无效、是否把错误提示吞掉、是否在校验失败时直接返回导致后续保存逻辑根本没走到。
4、核对数据源状态
就算网格显示已变化,也要确认数据源对象是否真正变更成功。DataTable或BindingSource这类数据源通常能看到行状态变化,自定义对象集合则要确认属性值是否写入、是否缺少属性变更通知,导致外层保存模块判断为“无变更不需要保存”。
5、排除行错位
当编辑列参与排序或过滤时,提交瞬间行位置可能变化,保存逻辑如果用行索引或RowHandle去取对象,可能取到另一条记录。更稳的做法是以主键字段或数据对象引用作为保存依据,而不是依赖当前行位置。
6、核实落库调用
当前面几层都确认无误后,再看落库层是否真的执行更新,是否被异常捕获后未上抛,或事务范围导致回滚。把数据库排查放在最后,可以避免在提交链路没跑通时做无效的落库定位。
二、DevExpress GridControl提交事件该检查哪些点
事件排查的关键是分层,单元格层事件负责值变化过程,行层事件负责把变化写回数据源,保存层才负责落库。把事件与提交动作对齐,才能判断是事件没触发,还是触发了但被拦截或被短路。
1、区分单元格与行
CellValueChanging与CellValueChanged能说明用户输入发生了变化,但不等于已经写回数据源。若保存依赖行提交,排查重心应放在行校验与行更新这一层,不要只盯着单元格事件就下结论。
2、检查编辑器校验
ValidatingEditor这类事件发生时,新值可能还在编辑器里,尚未落到数据对象上,如果你在这里读取数据源会看到旧值,从而误判为不保存。还要确认是否在这里拦截了输入,导致后续提交根本无法发生。
3、核对行校验
ValidateRow更接近提交入口,它决定行是否允许被提交。需要检查校验触发条件是否满足、校验失败时是否阻断提交、错误信息是否能让用户感知,否则会出现“看似保存失败,实际被校验挡住”的情况。
4、补齐保存前置提交
如果保存按钮只做落库调用,不做提交动作,用户停在编辑态时就很容易漏掉最后一次修改。建议把保存按钮流程固化为先提交编辑器、再提交当前行、再读取数据源做持久化,让保存动作不依赖用户是否切行或失焦。
5、关注WPF时机
在WPF场景里,默认提交时机与WinForms不同,很多变化需要在提交编辑后才会进入数据源。排查时要确认是否在保存前做了提交编辑动作,必要时再结合即时提交相关配置,避免“UI变了但对象没变”的错觉。
6、确认更新未短路
不少项目在RowUpdated或数据源更新事件里做写库或调用服务,若该事件没触发或被条件判断跳过,就会出现编辑成功但不保存。建议在行更新入口加断点或日志,确认是否进入、进入时对象是否为预期记录、更新分支是否被提前返回。
三、GridControl编辑链路复核
当问题表现不稳定时,往往与最后一次编辑未提交、不同列编辑器提交时机差异、或校验提示不清有关。用固定复现动作做回归,可以更快把问题固化到具体点位。
1、复现最后一格
把复现步骤固定为编辑某格后不离开单元格直接点【保存】,如果此时失败而失焦后成功,基本可以判定是提交动作缺失或提交顺序不对,优先回到保存前置提交去修正。
2、逐列定位
如果只有少数列不保存,优先按列检查该列的编辑器类型、是否替换了自定义编辑器、是否绑定了额外校验或转换逻辑。很多问题并不是整张表的提交链路坏了,而是某一列的编辑器行为与其他列不同。
3、验证校验提示
当校验失败时,如果没有明确提示,用户会把它当成保存无效。建议在校验失败时给出可定位的字段信息与原因,并确认失败时不会继续进入落库逻辑,避免出现一边提示错误一边仍尝试保存的混乱行为。
4、区分刷新与保存
有些场景是外部线程或服务更新了数据源,网格显示未刷新被误判为没保存;也有些场景是网格显示更新了但数据源未变更才是真提交问题。复核时要分别核对显示层与数据源层,避免把刷新问题当成提交问题处理。
总结
GridControl编辑后不保存,优先从提交链路入手,先处理编辑器提交与行提交,再检查行校验是否拦截、数据源对象是否真实变更、保存依据是否因排序过滤而错位,最后才去核实落库调用与事务回滚。提交事件排查要分清单元格层、行层、保存层的职责,并把【保存】按钮的前置提交动作固化下来,通常就能把“看起来改了但不保存”的问题定位到具体事件与具体调用点。
