这种情况该用Combobox呢,还是DBCOMBOBOX,以及实现方法。

babys 2003-09-10 03:18:12
如何才能实现数据库的某字段显示在COMBOBOX中,在COMBOBOX中输入一值立刻搜索ITEM中的近似值,根据输入的改变而改变ITEM,使输入越精确,COMBOBOX中的匹配项越来越少,到用户找到数据后使用光标或鼠标可以选择进来。其它的各控件在COMBO选定以后立刻显示出这个记录的各值。怎么做?用什么控件?
...全文
116 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
brillientking 2003-09-14
  • 打赏
  • 举报
回复
楼上应该再加一句:
Query1->Next();
myan18 2003-09-12
  • 打赏
  • 举报
回复
OnKeyPress事件,当你输入某一值时,执行小侃哥的代码,COMBOBOX的状态变为下拉,
就行了。
babys 2003-09-12
  • 打赏
  • 举报
回复
财智老板通里的就是这情形,小侃哥这样只是实现了加入ITEM,但是应该加在控件中的什么事件实现用上下键选择呢,反正CHANG事件是不行的啊,一按键,COMBOBOX的光标就跑到前面去了,文字顺序就颠倒了。比如输入“奔腾”,结果变成“腾奔”,而且不会出现下拉列表,再者就是无法用上下键选择。求救之。

如果觉得分不够,还可以加。
whp320 2003-09-12
  • 打赏
  • 举报
回复
将数据库中的数据读进ComboBox中要利要DataSet中的三条属性:
RecordCount
FieldCount和Fields
用一条循环语句这样实现把所有的数据库中的数据读进ComboBox
 for(int i=0;i<RecordCount;i++)
{
for(int j=0;j<FieldCount;j++)
{
ComboBox1->Items->Add(Query1->Fields->Fidld[j]->AsString);
}
}
大概是这样,我时间有限不能够完善这个程序 。利用FieldName还可以读进字段里面的名字
中骑士 2003-09-12
  • 打赏
  • 举报
回复
to: raulfan(范特西)
楼主有一句话你没注意:“COMBOBOX中的匹配项越来越少”,这一条要求在你的程序中没达到!
楼主是否有同感?
建议楼主许诺加分!
raulfan 2003-09-12
  • 打赏
  • 举报
回复
你说的是“自动完成”功能
WORD lastkey ;

//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
String value = ComboBox1->Text ;

// If the user tried to delete he must not want to change anything.
if (lastkey == '\b' || lastkey == VK_DELETE)
{
lastkey = 0 ;
return ;
}
lastkey = 0 ;
// 确保使用者没有在中间插入字符
if (ComboBox1->SelStart != value.Length ())
return ;

// 在下拉列表中寻找匹配项.
int index = SendMessage (ComboBox1->Handle, CB_FINDSTRING, -1, (LPARAM) value.c_str ()) ;
if (index >= 0)
{
// 找到匹配项并显示.
ComboBox1->ItemIndex = index ;
String newtext = ComboBox1->Text ;
SendMessage (ComboBox1->Handle, CB_SETEDITSEL, 0, MAKELPARAM (value.Length (), -1)) ;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1KeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
// 按下的最后一个键值.
lastkey = Key ;
}
//---------------------------------------------------------------------------
swites 2003-09-11
  • 打赏
  • 举报
回复
楼上的方法对小型数据库可以,但对8000条以上纪录就不行了,所以最好是建立索引,分块查找较好
xiaokange 2003-09-11
  • 打赏
  • 举报
回复
可以用这样试试啊:
ComboBox1->Clear();
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->Add("select 字段名 from 表名 where 字段名 like '"+ComboBox1->Text.Trim()+"%'");
ADOQuery1->Open();
if(ADOQuery1->RecordCount)
{
ADOQuery1->First();
while(!ADOQuery1->Eof)
{
ComboBox1->Items->Add(ADOQuery1->FieldByName("字段名")->AsString);
ADOQuery1->Next();
}
}
52vc 2003-09-11
  • 打赏
  • 举报
回复
用combox好了,因为dbcombox会对数据库进行操作
中骑士 2003-09-11
  • 打赏
  • 举报
回复
我也有此问题,关注!
UP!
不过我知道:一般实现这种 是在DBGrid控件中(我看见过别人的程序):在DBGrid的格子的第一列中输入值,然后出现ITEM,然后右边的几个格子出现这个记录的各属性值.

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧