C++ Builder 2007中如何将TSQLDataSet记录数据导入ListBox?
把TSQLDataSet的数据推到ListBox的方法(C++ Builder 2007 + dbExpress)
嘿,别担心你的问题直白——刚捡回C又碰新数据库组件,懵是正常的!我当年在C Builder 2007里折腾dbExpress的时候也卡过这个点,给你两种实用的方法,按需选就行:
方法一:手动遍历记录(简单直接,适合新手)
这是最容易理解的方式,手动逐条读取记录然后加到ListBox里:
确保数据库连接和数据集已打开
先确认你的SQLConnection1已经连接上数据库(可以在设计时把Connected设为true,或者在代码里打开),然后打开TSQLDataSet:// 比如在按钮点击事件里写 void __fastcall TForm1::btnLoadDataClick(TObject *Sender) { try { // 如果连接没开,先打开 if (!SQLConnection1->Connected) SQLConnection1->Open(); SQLDataSet1->Open(); // 打开数据集 } catch (Exception &e) { ShowMessage("数据库出错啦:" + e.Message); return; } }清空ListBox并遍历数据
接着把数据集里的记录逐条取出来加到ListBox:// 继续在按钮事件里加 ListBox1->Items->BeginUpdate(); // 优化性能,避免频繁刷新 ListBox1->Items->Clear(); // 先清空旧内容 SQLDataSet1->First(); // 移到第一条记录 while (!SQLDataSet1->Eof) // 直到遍历完所有记录 { // 替换成你要显示的字段名,比如"UserName"或者"ID" String fieldContent = SQLDataSet1->FieldByName("你的字段名")->AsString; // 如果要显示多个字段,直接拼接就行 // String fieldContent = IntToStr(SQLDataSet1->FieldByName("ID")->AsInteger) + " - " + SQLDataSet1->FieldByName("UserName")->AsString; ListBox1->Items->Add(fieldContent); SQLDataSet1->Next(); // 移到下一条 } ListBox1->Items->EndUpdate(); // 结束更新,刷新ListBox
方法二:数据绑定(自动更新,适合动态数据)
如果你的数据集会经常更新,用绑定的方式更省心,需要用到TDataSource组件:
配置组件关联
- 拖一个
TDataSource到窗体上,把它的DataSet属性选成你的TSQLDataSet1 - 选中
ListBox1,把它的DataSource设为刚才的DataSource1,DataField设为你要显示的字段名 - 把
ListBox1的Style属性改成lbOwnerDrawFixed(不然绑定了也显示不出来)
- 拖一个
自定义显示多字段(可选)
如果要显示多个字段,在ListBox1的OnDrawItem事件里写自定义绘制代码:void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) { TListBox* lb = dynamic_cast<TListBox*>(Control); if (lb && SQLDataSet1->Active) { SQLDataSet1->RecNo = Index + 1; // 定位到当前索引对应的记录 String showText = SQLDataSet1->FieldByName("ID")->AsString + " | " + SQLDataSet1->FieldByName("UserName")->AsString; lb->Canvas->FillRect(Rect); lb->Canvas->TextOut(Rect.Left + 3, Rect.Top + 2, showText); } }这样ListBox就会自动跟着
TSQLDataSet的数据变化更新啦!
小提醒
- 记得替换代码里的字段名成你数据库里实际的字段,别直接抄哦
- 如果数据集数据量很大,用
BeginUpdate和EndUpdate包裹添加操作,能大幅提升ListBox的加载速度 - 永远记得加
try-catch捕获异常,不然数据库出问题程序直接崩了可不好
内容的提问来源于stack exchange,提问作者Derek K
相关产品推荐
相关产品推荐

