我的数据库表中有三个字段:
sdm(省代码),ddm(市代码),xdm(县)代码我的问题是:
取出数据后,DBLookupcombobox可以显示所在省、市、县的名称
然后改变省代码后,后面的市、县自动联动给出所在省的相关数据请大家给点意见吧,谢谢!问题解决后,另开贴100分酬谢。

解决方案 »

  1.   

    省代碼相關combobox//在change事件
    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中,也對縣處理
      

  2.   

    谢谢Avan_Lau :
    测试了下,但个问题哈:change里面的代码执行了两次????
    然后在县的change代码中好象还多执行两次,我用showmessage来监听的
      

  3.   

    是重复触发了change事件,楼主,自己加一个变量去判断一下吧
      

  4.   

    我猜測:你的幾個combobox是與數據集相連的。
    數據集一但有變化,則會觸發此事件。你可以這樣避免:當數據集有改動時(如beforeedit或beforeinsert),調用dataset.diabledcontrols,改動結束時(如afterpost),調用dataset.eabledcontrols
      

  5.   

    Avan_Lau :您说得应该是正确的
    我说的情况目前在加载form的时候就发现了,在修改的时候有没有出现这种情况,现在还没有测试。你的解决办法能不能再说详细一点呢?或都代码提示最为直观,谢谢。
      

  6.   

    自己写两个过程
    然后到ONCHANGE事件中用
      

  7.   


    //在formcreate事件
      dataset.disablecontrol
    //在formshow事件
      dataset.enableControl此方法并不一定适合,要根据你的实际情况
      

  8.   

    我做了一个简单的测试程序,完整代码如下:
    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.
      

  9.   

    程序运行结果,显示在Memo1中的信息为,大家帮我看看究竟是什么原因吧,应该如何避免,谢谢!执行--->yxsdmPropertiesChange
    执行zydmPropertiesChange
    执行zydmPropertiesChange
    执行--->yxsdmPropertiesChange
    执行zydmPropertiesChange
    执行zydmPropertiesChange
    执行zydmPropertiesChange
    执行zydmPropertiesChange
      

  10.   

    你跟踪代码就可以知道了,看不出来,不过可以这样避免var
      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;
      

  11.   

    Avan_Lau :谢谢您,不过这样也会有个问题:当窗体加载后,改变zydmPropertiesChange的时候,第三个ComboBox中的数据就没有了。
    我已通过QQ向你加为好友了,我把程序传给你再麻烦你帮助下吧,谢谢。
      

  12.   

    在zydmProperties click事件里 將HaveRun設為true。
    若你只希望程序在 選擇時才觸發這些事件,而dataset scroll時不觸發這些事件,可以這樣用。