【发布时间】:2015-05-10 10:01:39
【问题描述】:
我刚刚开始学习 Delphi,但遇到了问题。我会从另一种形式刷新 DBGrid。我的代码:
表格1:
unit uForm1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls;
type
TForm1 = class(TForm)
btnAdd: TButton;
grid: TDBGrid;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
procedure btnAdd(Sender: TObject);
private
public
constructor Create(Owner:TComponent); overload;
end;
var
form1: TForm1;
implementation
uses uForm2, uDbOperations;
{$R *.dfm}
procedure TForm1.btnAddClick(Sender: TObject);
var
frm : TForm2;
begin
frm := TForm2.Create(form1);
frm.ShowModal;
frm.Free;
end;
表格2:
unit uForm2;
procedure TForm2.btnAddClick(Sender: TObject);
var
query : string;
begin
query := 'Insert into Employees(Name) Values('''+txtName.Text+''');';
DbOperations.InsertOrUpdate(query, ADOQuery1);
ModalResult := mrCancel;
//And this here I'd refresh grid on form1
end;
end.
在form2中添加记录后如何刷新form1中的dbgrid?我尝试了很多方法,但没有成功。我知道在 C# 中需要在构造函数中传递引用,但是 delphi 怎么做?
【问题讨论】:
-
如果 DBgrid 连接到 DataSoource1,则在关闭模态表单后只需
DataSource1.DataSet.Refresh。 -
@TLama 我编辑我的评论。我看不到谁是 DBGrid 数据源
-
@Val,你是对的!我已经删除了我的评论。它们将是单独的组件,这很好(尽管它们都具有相同的名称,但事实并非如此)。所以,我只是将它添加到 centralize 数据集组件中,您可以使用数据模块而不是表单。还要考虑如果用户将
x'; DROP TABLE Employees;输入到您的txtName控件中会发生什么。并使用try..finally块确保资源将被释放(在您的代码中frm实例)。而且返回的mrCancel看起来很奇怪。 -
@TLama,非常感谢!我使用了一个数据模块,它的工作原理!至于 txtName 中的 drop table,如何保护呢?最后我在块中添加 - “form2.Free”,我有一个错误(访问冲突......)。怎么了? mrCancel 我曾经关闭模式。
-
@TLama 您的评论是对这个问题的绝妙回应。评论中还有一件很有趣的事情:SQL Injection en.wikipedia.org/wiki/SQL_injection 。请将其发布为答案。