我的数据库表中有三个字段:
sdm(省代码),ddm(市代码),xdm(县)代码我的问题是:
取出数据后,DBLookupcombobox可以显示所在省、市、县的名称
然后改变省代码后,后面的市、县自动联动给出所在省的相关数据请大家给点意见吧,谢谢!问题解决后,另开贴100分酬谢。
sdm(省代码),ddm(市代码),xdm(县)代码我的问题是:
取出数据后,DBLookupcombobox可以显示所在省、市、县的名称
然后改变省代码后,后面的市、县自动联动给出所在省的相关数据请大家给点意见吧,谢谢!问题解决后,另开贴100分酬谢。
begin
with Query do//設定好取 市 的sql
begin
if active then active := false;
ParamBYName('SDM').Asstring := 省代碼;
active := True;
if not eof then
first;
while not eof do
begin
市combobox.items.add(FieldByname('ddm'));
next;
end;
end;
end;依次類推,在市combobox中的change中,也對縣處理
测试了下,但个问题哈:change里面的代码执行了两次????
然后在县的change代码中好象还多执行两次,我用showmessage来监听的
數據集一但有變化,則會觸發此事件。你可以這樣避免:當數據集有改動時(如beforeedit或beforeinsert),調用dataset.diabledcontrols,改動結束時(如afterpost),調用dataset.eabledcontrols
我说的情况目前在加载form的时候就发现了,在修改的时候有没有出现这种情况,现在还没有测试。你的解决办法能不能再说详细一点呢?或都代码提示最为直观,谢谢。
然后到ONCHANGE事件中用
//在formcreate事件
dataset.disablecontrol
//在formshow事件
dataset.enableControl此方法并不一定适合,要根据你的实际情况
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBTables, DBCtrls, cxGraphics, cxControls,
cxContainer, cxEdit, cxTextEdit, cxMaskEdit, cxDropDownEdit,
cxLookupEdit, cxDBLookupEdit, cxDBLookupComboBox, StdCtrls;type
TForm1 = class(TForm)
dsStuList: TDataSource;
DBGrid1: TDBGrid;
qryStuList: TQuery;
Database1: TDatabase;
qryYXSDM: TQuery;
dsYXSDM: TDataSource;
yxsdm: TcxDBLookupComboBox;
zydm: TcxDBLookupComboBox;
yjfxdm: TcxDBLookupComboBox;
qryZYDM: TQuery;
dsZYDM: TDataSource;
qryYJFXDM: TQuery;
dsYJFXDM: TDataSource;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure OpenQuery(sdQry: TQuery; ds: TDataSource; SQL: string);
procedure BindDBLookUpField(clist: TcxDBLookupComboBox; DataSource: TDataSource; DataField: string; ListSource: TDataSource; Code, Name: string; Col1Width, Col2Width: Integer);
procedure yxsdmPropertiesChange(Sender: TObject);
procedure zydmPropertiesChange(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.OpenQuery(sdQry: TQuery; ds: TDataSource; SQL: string);
begin
sdQry.DatabaseName := ExtractFilePath(Application.ExeName);
sdQry.Close;
sdQry.SQL.Clear;
sdQry.SQL.Add(SQL);
sdQry.Open;
ds.DataSet := sdQry;
end;
procedure TForm1.BindDBLookUpField(clist: TcxDBLookupComboBox; DataSource: TDataSource; DataField: string; ListSource: TDataSource; Code, Name: string; Col1Width, Col2Width: Integer);
begin
clist.Style.Font.Name := '宋体';
clist.Style.Font.Size := 9;
clist.Properties.DropDownSizeable := True;
clist.Properties.DropDownRows := 10;
clist.Properties.GridMode := True;
clist.Properties.DropDownAutoWidth := True;
clist.DataBinding.DataSource := DataSource;
clist.DataBinding.DataField := DataField;
clist.Properties.DropDownAutoSize := True;
clist.Properties.ListSource := ListSource;
clist.Properties.KeyFieldNames := Code;
clist.Properties.ListFieldNames := Code + ';' + Name;
clist.Properties.ListFieldIndex := 1;
clist.Properties.ListColumns.Items[0].Caption := '代码';
clist.Properties.ListColumns.Items[0].FieldName := Code;
clist.Properties.ListColumns.Items[0].Width := Col1Width;
clist.Properties.ListColumns.Items[0].HeaderAlignment := taCenter; clist.Properties.ListColumns.Items[1].Caption := '名称';
clist.Properties.ListColumns.Items[1].FieldName := Name;
clist.Properties.ListColumns.Items[1].Width := Col2Width;
clist.Properties.ListColumns.Items[1].HeaderAlignment := taCenter; clist.Properties.ListColumns.Items[0].Properties.Alignment.Horz := taCenter;
clist.Properties.ListColumns.Items[1].Properties.Alignment.Horz := taLeftJustify;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
qryStuList.DatabaseName := ExtractFilePath(Application.ExeName);
qryStuList.RequestLive := True;
qryStuList.CachedUpdates := True;
qryStuList.Close;
qryStuList.SQL.Clear;
qryStuList.SQL.Add('select * from bbk');
qryStuList.Open; dsStuList.DataSet := qryStuList;
DBGrid1.DataSource := dsStuList; OpenQuery(qryYXSDM, dsYXSDM, 'select distinct yxsdm,yxsmc from zyml order by yxsdm');
BindDBLookUpField(yxsdm, dsStuList, 'yxsdm', dsYXSDM, 'yxsdm', 'yxsmc', 50, 150);end;procedure TForm1.yxsdmPropertiesChange(Sender: TObject);
begin
Memo1.Lines.Add('执行--->yxsdmPropertiesChange');
OpenQuery(qryZYDM, dsZYDM, 'select distinct zydm,zymc from zyml where yxsdm=' + QuotedStr(yxsdm.EditValue) + ' order by zydm');
BindDBLookUpField(zydm, dsStuList, 'zydm', dsZYDM, 'zydm', 'zymc', 50, 150);end;procedure TForm1.zydmPropertiesChange(Sender: TObject);
begin
Memo1.Lines.Add('执行zydmPropertiesChange');
OpenQuery(qryYJFXDM, dsYJFXDM, 'select distinct yjfxdm,yjfxmc from zyml where yxsdm=' + QuotedStr(yxsdm.EditValue) + ' and zydm=' + QuotedStr(zydm.EditValue) + ' order by yjfxdm');
BindDBLookUpField(yjfxdm, dsStuList, 'yjfxdm', dsYJFXDM, 'yjfxdm', 'yjfxmc', 50, 150);
end;end.
执行zydmPropertiesChange
执行zydmPropertiesChange
执行--->yxsdmPropertiesChange
执行zydmPropertiesChange
执行zydmPropertiesChange
执行zydmPropertiesChange
执行zydmPropertiesChange
HaveRun : Boolean;procedure TForm1.yxsdmPropertiesChange(Sender: TObject);
begin
Memo1.Lines.Add('执行--->yxsdmPropertiesChange');
HaveRun := False;
OpenQuery(qryZYDM, dsZYDM, 'select distinct zydm,zymc from zyml where yxsdm=' + QuotedStr(yxsdm.EditValue) + ' order by zydm');
BindDBLookUpField(zydm, dsStuList, 'zydm', dsZYDM, 'zydm', 'zymc', 50, 150); end; procedure TForm1.zydmPropertiesChange(Sender: TObject);
begin
if not HaveRun then//加判断,避免重复执行
begin
Memo1.Lines.Add('执行zydmPropertiesChange');
OpenQuery(qryYJFXDM, dsYJFXDM, 'select distinct yjfxdm,yjfxmc from zyml where yxsdm=' + QuotedStr(yxsdm.EditValue) + ' and zydm=' + QuotedStr(zydm.EditValue) + ' order by yjfxdm');
BindDBLookUpField(yjfxdm, dsStuList, 'yjfxdm', dsYJFXDM, 'yjfxdm', 'yjfxmc', 50, 150);
HaveRun := True;
end;
end;
我已通过QQ向你加为好友了,我把程序传给你再麻烦你帮助下吧,谢谢。
若你只希望程序在 選擇時才觸發這些事件,而dataset scroll時不觸發這些事件,可以這樣用。