You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi DBGrid无法及时刷新,单次点击无效多次才生效求助

DBGrid单次点击刷新无效的问题修复

核心问题分析

  1. 插入与刷新顺序完全颠倒
    你在Form2的按钮点击事件里,先调用Form1.Refresh刷新数据,之后才执行INSERT操作。这就导致第一次刷新时,新数据根本还没写入数据库,DBGrid自然显示旧内容,多次点击后才可能看到后续插入的数据(其实是之前点击没生效的插入操作)。

  2. Refresh方法冗余操作导致状态混乱
    你的Refresh函数里做了一堆重复且矛盾的操作:打开ADOQuery后又刷新数据源、反复切换Active状态、多次调用Open,这些操作不仅没必要,还会让数据集处于不稳定状态,反而影响刷新效果。


修正后的代码

Form2按钮点击事件(先插入再刷新)

procedure TForm2.btnSafeClick(Sender: TObject);
begin
  try
    // 先完成数据插入
    ADOQuery1.SQL.Text := 'INSERT INTO ITEMS(name, Amount, description, size, IMGLINK) VALUES (:NA, :CT, :DS, :SZ, :IMG)';
    // 修正原代码参数顺序不匹配的问题,同时补充IMGLINK字段的参数
    ADOQuery1.Parameters.ParamByName('NA').Value := txtName.Text;
    ADOQuery1.Parameters.ParamByName('CT').Value := StrToInt(lblCT.Caption);
    ADOQuery1.Parameters.ParamByName('DS').Value := txtDescription.Text;
    ADOQuery1.Parameters.ParamByName('SZ').Value := StrToInt(cbSize.Text);
    ADOQuery1.Parameters.ParamByName('IMG').Value := ''; // 根据实际业务赋值,这里暂为空
    ADOQuery1.ExecSQL;

    // 插入成功后再刷新Form1的数据集
    Form1.Refresh;
  finally
    Self.Close;
  end;
end;

Form1简化后的Refresh方法

procedure TForm1.Refresh;
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT ID, Name, size, amount FROM ITEMS');
  ADOQuery1.Open;
end;

额外注意事项

  • 原INSERT语句的参数顺序和字段顺序不匹配,会导致数据插入到错误的字段中,必须严格对应;
  • IMGLINK字段在原代码中没有对应参数,执行时会报错,需要补充赋值;
  • 新手阶段尽量避免直接跨Form调用组件,后续可以考虑用事件通知或者全局数据集管理的方式优化代码结构。

内容的提问来源于stack exchange,提问作者Henry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:05:29