你好,看到你的回答知道你是个高手,有个对我来说的难题,希望你能解答一下,万分感谢。
有两个表
create table product_category(
product_category_id  int identity   not null,
product_category_name varchar(20)  COLLATE Chinese_PRC_CI_AS NOT NULL ,
py_code   varchar(10)  COLLATE Chinese_PRC_CI_AS NULL
)
create table product_category2(
product_category2_id  int identity  not null,
product_category_id  int  null,
product_category2_name varchar(20)  COLLATE Chinese_PRC_CI_AS NOT NULL ,
py_code   varchar(10)  COLLATE Chinese_PRC_CI_AS NULL
)
dbgrid1通过一个TADOTABLE与product_category2相连  dbgrid1只显示三列
columns[0]显示product_category2_name字段  columns[1]显示py_code字段  columns[2]显示product_category_id字段
在columns[2]这个字段里面我用了下面的方法
with datamodule.DataModuleF.ADOQuery1 do
    begin
     close;
     sql.Clear;
     sql.Add('select product_category_name from product_category');
     open;
     while not eof do
     begin
     dbgrid1.Columns[2].PickList.add(fieldbyname('product_category_name').AsString);
     next;
     end;
    end;  
就是在columns[2]字段里面显示产品大分类的名称来给用户选择,但是这里出现了类型不匹配问题columns[2]显示product_category_id这里是int类型,但是dbgrid1.Columns[2].PickList.add(fieldbyname('product_category_name').AsString);里的'product_category_name是varchar类型的,出现了错误。要怎么样才能得到改正。
然后要怎么样把'product_category_name映射为product_category_id进行保存。

解决方案 »

  1.   

    写成    sql.Add('select distinct product_category_name from product_category');是不是好点.
    另外,象这类你需要动态指定DBGRID里面显示内容的,还是先查看以下DBGRID的FIELDS内容,最好全清空.
      

  2.   

    我建议你啊,不要这样做,因为dbgrid在默认情况下是可以编辑的,它直接反映到数据表中,当然容易处错了,你可以做一个视图啊,用那个大分类的id做关联,然后把视图绑定到dbgrid上再有,dbgrid最好只用来显示,不要让它可编辑,很容易处错,而且系统要为它开辟一个数据缓冲,adoquery不合适,我喜欢用dbtable绑定。
      

  3.   

    比较麻烦
    偶也赞同DBGRID  
    只用来显示数据
    编辑还是用专门的组件
    如果你一点要用 DBGRIFEH
    可以满足你
    你这样自己写事件改的话
    如果数据量很大 效率也是问题
      

  4.   

    你的目的就是根据product_category_id的值来选择product_category表里的product_category_name 字段的内容,用LookUpField试一下,LookupDataSet 设置为product_category表对应的TDataSet,LookupKeyFields属性设置为product_category_id,LookupResultField属性设置为product_category_name ,大概是这样,你自己试试看,可能还要设置一些其它属性
      

  5.   

    提供一个菜鸟级的解决方案:建立一个临时表,按照你的需要设置列属性,然后组合查询写入临时表,程序结束时删除临时表.
    with datamodule.DataModuleF.ADOQuery1 do
        begin
         close;
         sql.Clear;
         sql.Add('create table temp(
    product_category_name varchar(20)  COLLATE Chinese_PRC_CI_AS NOT NULL ,
    product_category2_name varchar(20)  COLLATE Chinese_PRC_CI_AS NOT NULL ,
    py_code   varchar(10)  COLLATE Chinese_PRC_CI_AS NULL)');
         open;
        end;    然后将你要选择的数据写如这个临时数据库里面.   最后sql.Add('dorp table temp');
      

  6.   

    也可以这样实现,不要用dbgrid,使用stringgrid,专门用事件消息来填充数据信息,这样就可以不直接映射到数据库中了,也不会出现类型匹配不正确了,数据保存装载和数据存储都用事件完成,不过代码量是大了些,可是很好用,我用过,用stringgrid和combobox可以实现这样的功能