现在我在两个数据库,一个是员工资料数据库(ygzl),一个是部门信息数据库(bmxx).
员工资料的表如下:
bh
xm
bm
jb
部门信息的表如下:
bmbh
bmmc
在DBGrid显示ygzl数据时,点击bm字段时自动显示bmxx的数据库信息。
请教高手,这个问题要如何来用Delphi解决
员工资料的表如下:
bh
xm
bm
jb
部门信息的表如下:
bmbh
bmmc
在DBGrid显示ygzl数据时,点击bm字段时自动显示bmxx的数据库信息。
请教高手,这个问题要如何来用Delphi解决
---- 1、 在Delphi 4.0中新建一个项目。
---- 2、 分别拖动的Data Access组件板上DataSource、Table,Data Controls组件板上DBGrid,DBComboBox四个组件到Form1上。
---- 3、 设置各个组件的属性如下: rcf1对象 属性 设定植
Form1 Caption '在DBGrid中插入SpinEdit组件示例'
DataSource1 DataSet Table1
Table1 DatabaseName DBDEMOS
TableName 'teacher.DBF'
Active True
DBGrid1 DataSource DataSource1
DBComboBox1 DataField SEX
DataSource DataSource1
Visible False
Strings Items. '男'| '女' ---- 注意:我在这里用了Teacher.dbf,那是反映教职工的性别,只能是“男”或者是“女”。 ---- 4、 DrawDataCell事件是绘制单元格,当获得焦点网格所对应的字段与组合框所对应的字段一致时,移动组合框到获得焦点的网格上,并且
使组合框可视,从而达到在DBGrid指定列上显示DBComboBox的功能。设置DBGrid1的OnDrawDataCell事件如下:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
begin
if (gdFocused in State) then
begin
if (Field.FieldName = DBComboBox1.DataField ) then
begin
DBComboBox1.Left := Rect.Left + DBGrid1.Left;
DBComboBox1.Top := Rect.Top + DBGrid1.top;
DBComboBox1.Width := Rect.Right - Rect.Left;
DBComboBox1.Height := Rect.Bottom - Rect.Top;
DBComboBox1.Visible := True;
end;
end;
end;---- 5、 DBGrid指定单元格未获得焦点时不显示DBComboBox,设置DBGrid1的OnColExit事件如下:
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
If DBGrid1.SelectedField.FieldName = DBComboBox1.DataField then
begin
DBComboBox1.Visible := false;
end;
end;---- 6、 当DBGrid指定列获得焦点时DrawDataCell事件只是绘制单元格,并显示DBComboBox,但是DBComboBox并没有获得焦点,数据的输入还是在单元格上进行。在DBGrid1的KeyPress事件中调用SendMessage这个 Windows API函数将数据输入传输到DBComboBox上,从而达到在DBComboBox上进行数据输入。因此还要设置KeyPress事件如下:
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if (key < > chr(9)) then
begin
if (DBGrid1.SelectedField.FieldName =DBComboBox1.DataField) then
begin
DBComboBox1.SetFocus;
SendMessage(DBComboBox1.Handle, WM_Char, word(Key), 0);
end;
end;
end;
const Rect: TRect; Field: TField; State: TGridDrawState);
var
i : integer;
begin
if ((Field.FieldName = 'bmmc') or (Field.FieldName = 'jsmc')) then
begin
DBGrid2.Left := Rect.Left + DBGrid1.Left;
DBGrid2.Top := Rect.Top + DBGrid1.top;
DBGrid2.Width := Rect.Right - Rect.Left;
DBGrid2.Height := Rect.Bottom - Rect.Top;
DBGrid2.Visible := True; if (Field.FieldName = 'bmmc') then
begin
ADOQuery2.Active := false;
ADOQuery2.SQL.Clear ;
ADOQuery2.SQL.Add('select bmbh,bmmc from T_SET_Bm');
ADOQuery2.Active := true; for i:=0 to ADOQuery2.FieldCount - 1 do
begin
DBGrid2.Columns.Add ;
DBGrid2.Columns[i].Alignment := taCenter;
if i=0 then
begin
DBGrid2.Columns[i].Title.Caption := '部门编号';
DBGrid2.Columns[i].FieldName := 'bmbh';
end
else
begin
DBGrid2.Columns[i].Title.Caption := '部门名称';
DBGrid2.Columns[i].FieldName := 'bmmc'
end;
end;
end
else if (Field.FieldName = 'js') then
begin
ADOQuery2.Active := false;
ADOQuery2.SQL.Clear ;
ADOQuery2.SQL.Add('select jsbh,jsmc from T_SET_JS');
ADOQuery2.Active := true; for i := 0 to ADOQuery2.FieldCount - 1 do
begin
DBGrid2.Columns.Add ;
DBGrid2.Columns[i].Alignment := taCenter;
if i=0 then
begin
DBGrid2.Columns[i].Title.Caption := '角色编号';
DBGrid2.Columns[i].FieldName := 'JSBH';
end
else
begin
DBGrid2.Columns[i].Title.Caption := '角色名称';
DBGrid2.Columns[i].FieldName := 'JSMC';
end;
end;
end;
DBGrid2.DataSource := DataSource2;
end;
end;procedure TSystemForm.DBGrid1ColExit(Sender: TObject);
begin
if (DBGrid1.SelectedField.FieldName = 'bmmc') or (DBGrid1.SelectedField.FieldName = 'jsmc')
then
DBGrid2.Visible := false;end;procedure TSystemForm.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var
name : string;
begin
if DBGrid2.SelectedIndex > 0 then
begin
name := ADOQuery2.FieldByName('jsmc').AsString ;
DBGrid1.SelectedField.Value := name;
DBGrid2.SetFocus ;
DBGrid2.Visible := false;
end;
end;
我现在把我写的这段代码贴出来了,不知为什么程序根本就没有运行DBGrid1DrawDataCell这个事件的程序。 不知在什么地方错了。在线等!
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids;type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
DataSource2: TDataSource;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
procedure DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
procedure DBGrid1ColExit(Sender: TObject);
procedure DBGrid1KeyPress(Sender: TObject; var Key: Char);
procedure DBGrid2CellClick(Column: TColumn);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var
P:TPoint;
begin
if (GDFocused in State) then
begin
if (Field.FieldName = DBGrid2.Fields[0].FieldName) then
begin
P.X :=Rect.Right;
P.Y := Rect.Top;
DBGrid2.Top := DBGrid1.ClientToScreen(P).Y;
DBGrid2.Left := DBGrid1.ClientToScreen(P).X;
DBGrid2.Visible := True;
end;
end;end;procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
If DBGrid1.SelectedField.FieldName = DBGrid2.Fields[0].FieldName then
begin
DBGrid2.Visible := false;
end;
end;procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if (key<>chr(9)) then
begin
if (DBGrid1.SelectedField.FieldName =DBGrid2.Fields[0].FieldName) then
begin
DBGrid2.SetFocus;
SendMessage(DBGrid2.Handle, WM_Char, word(Key), 0);
end;
end;
end;procedure TForm1.DBGrid2CellClick(Column: TColumn);
begin
with ADOQuery1 do
begin
if not Active then Open;
if not (State in [dsInsert,dsEdit]) then Edit;
ADOQuery1.FieldByName('bookID').AsString:=DBGrid2.Fields[0].Value;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from Lendbook');
Open;
end; with ADOQuery2 do
begin
Close;
SQL.Clear;
SQL.Add('select * from book');
Open;
end;
end;end.