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模式, 三是省得回头再去数据库里取键值了啊....

解决方案 »

  1.   

    一个combobox绑定多列数据的方法:
    有时数据库,编号-->值, 要放入ComboBox1 中,
      s:='1001';
      ComboBox1.Items.AddObject('员工A',TObject(( s)));  ShowMessage( String( ComboBox1.Items.Objects[0]));
      s:='1003';  
      ShowMessage( String( ComboBox1.Items.Objects[0]));  ComboBox1.Items.AddObject('员工X',TObject(( s)));
      ShowMessage( String( ComboBox1.Items.Objects[1]));
    这儿有个问题要确认:  把 S 转成 TObject 后,AddObject 方法是复制了这个对象,还是引用了指针!!!!!!
    我感觉是复制过去的, 而不是 指针引用.