• 主页
  • 招聘
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
XACZ 2007年07月08日
一个combobox绑定多列数据的方法
combobox是开发当中经常用到的控件,其实他也能很好的绑定数据,做到逻辑和表现分离。我们使用COMBOBOX,一

般是从数据库读取记录集然后循环添加到combobox的item当中,或者直接返回Tstrings给items,这样我么在界面

操作COMBOBOX只能得到顺序的索引或者选择的值,但对于类似(键,值)这样的结构,要一次性绑定两列就不好做了.

也有人使用addobject方法绑定对象列表,但是都有些指针问题不好解决,取出的值是乱码。
其实我的方法也是使用addobject方法绑定对象列表,而我使用的强制转型的方法:(delphi7 下测试通过)
代码如下:
首先定义自己的业务模型对象,其实就是数据表的映射
我的业务对象是这样的,很简单,只有两个数据域,没有方法:
TUserModel = class(TObject)
private
FUser_Id: integer;
FUser_Name: string;
public
property User_Id: integer read FUser_Id write FUser_id;
property User_Name: string read FUser_Name write FUser_Name;
end;
下来,假设我有个数据访问层对象TUserDAL,实现了方法: getUserList(sql: widestring): Tstrings;
很明显这个方法读取数据库记录集,转换成一个对象集返回,标准的三层结构:),下面是我的实现:

function TUserDAL.GetUserList(sql: widestring): TStrings;
var
aUser: TUserModel;
List: TStrings;
TempDataSet: TDataSet;
begin
List:= TStringList.Create;
//这句调用数据操作工具对象 FSQLHelper 的 GetDataSet 方法,读取数据库记录返回 TDataSet(不了解的可

学习下ms petshop);
TempDataSet:= FSQLHelper.GetDataSet(SQL);
while not TempDataSet.Eof do
begin
//这里每个循环创建一个 UserModel 对象,然后加载到 List 中
aUser:= TUserModel.Create;
aUser.User_Id:= TempDataSet.fieldbyname('User_id').AsInteger;
aUser.User_Name:= TempDataSet.fieldbyname('User_Name').AsString;
List.AddObject(TempDataSet.fieldbyname('User_Name').AsString, aUser);
TempDataSet.Next;
end;
//记得清理临时对象,别留下后遗症
freeandnil(TempDataSet);
result:= List;
end;

好了,数据获取工作完成,下来我们看表示层怎么做。

在窗体上放一个combobox控件,外加一个button,在button中onclick写下面的代码:

procedure TForm1.Button1Click(Sender: TObject);
var
UserDAL: TUserDAL;
begin
//这不就把对象集取到控件里来了嘛;
UserDAL:= TUserDAL.Create;
self.ComboBox1.Items:= UserDAL.GetUserList;
end;

下来测试一下看能不能在combobox1中同时取得 user_id和user_name, 在combobox1的onchange写代码:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
//这句话有点长,分解开来看看
//ComboBox1.Items.Objects[ComboBox1.ItemIndex] 当前选定项对应的对象, 其实就是在数据访问层次
//里逐个加入的 UserModel;
// as TUserModel 强制转型为 TUserModel,因为combobox的object集合是 TObject 类型的
// inttostr 这个不用说了吧?
showmessage(inttostr((ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TUserModel).User_id));
showmessage((ComboBox1.Items.Objects[ComboBox1.ItemIndex] as TUserModel).User_Name);
end;

哈哈,成功了吧?什么?这样有什么用?用处大了去啦,一能实现同数据库表的绑定,二是MVC模式, 三是省得回头再去数据库里取键值了啊....
...全文
392 点赞 收藏 4
写回复
4 条回复

还没有回复,快来抢沙发~

发动态
发帖子
Delphi
创建于2007-08-02

1461

社区成员

26.2w+

社区内容

Delphi 开发及应用
社区公告
暂无公告