我的要求其实很低,一个ComboBox组件,能连接数据库,如数据库中有这样一个表
    字段       ID         姓名
              0101        张三
              0102        李四
              0103        王五
              0104        张三    由于姓名可能重复,所以ID才是唯一的识别,我要的comboBox要显示“姓名”,但在连到唯一的识别ID上,我知道用DBLookupComboBox行,但我还得在这个comboBox里还有一个items是“全部”,当用户选择“全部”时再做相应的处理,DBLookupComboBox没有这个功能,第三方控件好象也不行,该如何处理这种情况?
    我不想用旁边加个checkBox写明“全部”的做法,那太丑了,只想用一个ComboBox处理。

解决方案 »

  1.   

    if combobox1.text='全部' then .....onclick
      

  2.   

    with adoquery1 do
       begin
         close;
          sql.clear;
          sql.add('select distinct 姓名 from 表');
           open;
           first;
           for i:=0 to recordcount-1 do
               begin
                 comboBox.items.add(fieldbyname('姓名').asstring);
                  next;
                end;
      

  3.   

    使用ComboBox,自己向里面写Item,不要用DBComboBox,使用ComboBox的Items.AddObjects,我不相信还解决不了你的问题了!可以通过一个Item关联一个Object,何况你的要求只是一个ID!
      

  4.   

    ComboBox.Items.Add('0001=张三');
    绘制的时候,只绘制Combobox.Items.Values[Combobox.Items.Names[index]],取值取Names
      

  5.   

    jinjazz(近身剪(N-P攻略)) ,你的做法我考虑过,但不想用,因为感觉不规范。
     gobiz(拔剑容易收剑难),你的想法不错,不过我的也不光是一个ID,只是如果能解决一个ID,别的问题也应该能解决,我先试试看,现在我正头大。
      

  6.   

    通过一个Item关联一个Object(比如结构指针)比较适合“不光是一个ID”的情况,
      

  7.   


    这个比较麻烦,我是这么做的:1. 首先定义一总ojbect的类型:type
        TCmBoxObj=class(TObject)
          id:string;
        end;2. 然后在你的form定义一个动态的array of TCmBoxObj,注意这个数组生存期和你的控件是一致的3. 在你向这个ComboBox添加元素时,使用gobiz(拔剑容易收剑难)所说的,ComboBox.Items.AddObjects
    注意在添加之前创建一个TCmBoxObj对象(这个对象作为你数组的一个元素),
    里面的id保存你数据库中的id,然后AddObjects时,将这个对象关联到item中4.使用的时候可以直接 TCmBoxObj(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).id 注意,你需要自己管理你的附加对象的创建和注销。
      

  8.   

    你可以把那ID的姓名字段里的值存入一个二维数组中,ComboBox的Items只加数组中的姓名值,这样通过ItemIndex可以很方便的在那个二维数组中找到相应的ID的。不过,你的那个“全部”项要有一个默认的ID号,这个ID是表中不存在,如00等。
    更简单一些的就是ComboBox的Items.AddObjects,这里提供了一个指针,根据姓名定位到ID是简单的事
      

  9.   

    同意gobiz(拔剑容易收剑难) ( ) 
    做个类你要什么的数据都可以
      

  10.   

    用这种方式:
    0101张三
    0102李四
    0103王五
    0104张三再add('0000全部');
    ID就取前几位,不会不好的,股票程序的代码拼音查找也是这样的.
      

  11.   

    放入listbox1和combobox1
    listbox1.Visible:=false;
    combobox1.Style:=csDropDownList;窗体创建时
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        adoquery1.SQL.Clear;
        adoquery1.SQL.Add('select * from aa');
        adoquery1.Open;
        if adoquery1.RecordCount<>0 then
        begin
            combobox1.Items.Add('全部');
            listbox1.Items.Add('全部');
            while adoquery1.Eof<>true do
            begin
                combobox1.Items.Add(adoquery1.fieldbyname('name').AsString);
                listbox1.Items.Add(adoquery1.fieldbyname('id').AsString);
                adoquery1.Next;
            end;
        end;
    end;选中单击combobox1时
    procedure TForm1.ComboBox1Click(Sender: TObject);
    begin
        showmessage(listbox1.Items.Strings[combobox1.ItemIndex]);
    end;
    不知道是不是这意思
      

  12.   

    少写一点,adoquery1循环完忘close了 呵呵