我的数据库表中有三个字段:
sdm(省代码),ddm(市代码),xdm(县)代码我的问题是:
取出数据后,DBLookupcombobox可以显示所在省、市、县的名称
然后改变省代码后,后面的市、县自动联动给出所在省的相关数据请大家给点意见吧,谢谢!问题解决后,另开贴100分酬谢。
sdm(省代码),ddm(市代码),xdm(县)代码我的问题是:
取出数据后,DBLookupcombobox可以显示所在省、市、县的名称
然后改变省代码后,后面的市、县自动联动给出所在省的相关数据请大家给点意见吧,谢谢!问题解决后,另开贴100分酬谢。
解决方案 »
- mdiform在主界面上的分页显示是如何实现的?
- RichEdit怎么这样啊,碰到希腊字母就出错,请高手指教!在线等待!
- 朋友能不能把这段话贴到各大学的网站或者那些白领精英常去的网站!!!!!!!!!!!!!!
- 请教图象保存问题,急急!!!
- 这到底是怎么回事?
- Delphi能定义 汇编语言的 段吗?
- 请教.这样的编码如果解码? 应该是很简单的算法!急!
- 哪位大虾有用httpcli或者NMHTTP控件上传文件的例子?你想要多少分我就赠你多少分!!
- 如何得到枚举类型共有多少个值?
- Windows消息中经常用到inherited;inherited语句到底是什么意思,怎样工作的。
- ServerSocket 采用stThreadBlocking方式,如何给指定的客户端发送数据,如何断开指定的Client?
- 还是多线程问题
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時不觸發這些事件,可以這樣用。