新手dbgrid的问题? (100分)

  • 主题发起人 主题发起人 a_ying
  • 开始时间 开始时间
A

a_ying

Unregistered / Unconfirmed
GUEST, unregistred user!
环境:
用paradox建二张表,一张基本表1,一张只有字段名的应用表2。

基本表1 (应用)表2

工号 姓名 住 址 电 话 技术等级 工号 姓 名 技术等级 出勤天数
0001 张三 南京路 36546 5级 (输入) (自动)(自动) (输入)
0002 李四 中山路 56987 4级
0003 王二 华工路 26545 6级
... ... ... ... ...
0900

1.在form1中添加table1,datasource1,DBgrid1 (指向表2);table2,datasource2,DBgrid2(指向表1)。

2.在dbgrid1中建立永久字段名:工号 姓 名 技术等级 出勤天数 。

3. 我想实现这样目的(运行期):在表中(DBGRID1)手工输入“工号”,如0003,
程序实现自动填写“姓名”,“技术等级”,而且“姓名”,“技术等级”能 改 写。
而“出勤天数”由手工输入,如30天 ,一行输入(自动填写)完毕后回车或按向下方向键,
表格自动换行(增加一行),继续完成类似输入,如0008,25天。直到满足需要,
并打印此表。

4.我试着使用下面办法(不使用查找字段方法,不增加其它控件),代码如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids;

type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Table1: TTable;
Table2: TTable;
DataSource2: TDataSource;
DBGrid2: TDBGrid;
procedure DBGrid1Enter(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DBGrid1Enter(Sender: TObject);
var
i:string;
begin
with table1 do
begin
last;
edit;
i:=dbgrid1.selectedfield.AsString ;
post;
edit;
table1.fieldbyname('工号').AsString :=i ;
table1.fieldbyname('姓名').AsString :=table2.fieldbyname('姓名').AsString ;
table1.fieldbyname('技术等级').AsString :=table2.fieldbyname('技术等级').AsString ;
post;
end;
end;
end.

5. 问:上述方法错在哪?比较好的方法是。。。?如果用query控件,sql语句如何写,通过什么事件触发较好?
烦请大侠指点,原闻其详! 最好有代码提示。先谢谢了![:)][green][/green]
 
不应该写在DBGridEnter事件中,应该在keydown(or keypress)中截消息,如果按下的键是回车,
就从原来的表中去取姓名,技术等级信息
 
用keypress是对的,但还是不能实现我的目的。
 
yazhi的办法不能处理用户用鼠标和Tab键离开字段的情况,
比较好一点的办法是处理DBGrid的OnColExit,即离开某一列时进行判断。
OnEnter事件是当用户的输入焦点进入DBGrid时,也就是用户按Tab键或者
用鼠标点中DBGrid时发生。

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
with DBGrid1.SelectedField do
if (Name='工号') and // 仅当要离开的字段是“工号”字段
(DataSet.State in [dsInsert,dsEdit]) then // 且数据集处于编辑和插入状态时才有必要读入姓名和级别
begin
if Table2.Locate('工号',AsString,[]) then // 从表2中查找对应的记录
begin
Table1.FieldbyName('姓名').AsString:=Table2.FieldByName('姓名').AsString;
Table2.FieldByName('技术等级').AsString:=Table2.FieldByName('技术等级').AsString;
end;
end;
end;

 
接受答案了.
 
我先试试。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部