我的要求其实很低,一个ComboBox组件,能连接数据库,如数据库中有这样一个表
字段 ID 姓名
0101 张三
0102 李四
0103 王五
0104 张三 由于姓名可能重复,所以ID才是唯一的识别,我要的comboBox要显示“姓名”,但在连到唯一的识别ID上,我知道用DBLookupComboBox行,但我还得在这个comboBox里还有一个items是“全部”,当用户选择“全部”时再做相应的处理,DBLookupComboBox没有这个功能,第三方控件好象也不行,该如何处理这种情况?
我不想用旁边加个checkBox写明“全部”的做法,那太丑了,只想用一个ComboBox处理。
字段 ID 姓名
0101 张三
0102 李四
0103 王五
0104 张三 由于姓名可能重复,所以ID才是唯一的识别,我要的comboBox要显示“姓名”,但在连到唯一的识别ID上,我知道用DBLookupComboBox行,但我还得在这个comboBox里还有一个items是“全部”,当用户选择“全部”时再做相应的处理,DBLookupComboBox没有这个功能,第三方控件好象也不行,该如何处理这种情况?
我不想用旁边加个checkBox写明“全部”的做法,那太丑了,只想用一个ComboBox处理。
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;
绘制的时候,只绘制Combobox.Items.Values[Combobox.Items.Names[index]],取值取Names
gobiz(拔剑容易收剑难),你的想法不错,不过我的也不光是一个ID,只是如果能解决一个ID,别的问题也应该能解决,我先试试看,现在我正头大。
这个比较麻烦,我是这么做的: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 注意,你需要自己管理你的附加对象的创建和注销。
更简单一些的就是ComboBox的Items.AddObjects,这里提供了一个指针,根据姓名定位到ID是简单的事
做个类你要什么的数据都可以
0101张三
0102李四
0103王五
0104张三再add('0000全部');
ID就取前几位,不会不好的,股票程序的代码拼音查找也是这样的.
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;
不知道是不是这意思