it's easy!
新建一lookup型字段不就结了吗

解决方案 »

  1.   

    不太明白,用表的关联不行吗?两个表的DeptNo字段是要求一致吧
      

  2.   

    我上面不是新建一lookup型字段吗?
    给段代码吧,
    关联表,则数据怎么更新?
      

  3.   

    要镶嵌什么的一般都是画上去嘛,就像stringgrid一样,用DBGrid1CellClick配合
    DBGrid1DrawColumnCell事件里画
      

  4.   

    去看看《delphi5编程实例与技巧》第11.3章。
      

  5.   

    你那不是lookup型字段,lookup字段中的姓名字段变化时,原表中的deptno会自动改变,根本不用人工干预
    1.adodataset1->tablea;adodataset2->tableb;
    2.双击adotable1弹出字段编辑器新建一字段:姓名
      fieldtype:=lookup;keyfields:=deptno;dataset:=adodataset2;
      lookupfield:=deptno;result field:=deptname;
    3.确定后,把这个字段拖到窗体上,系统自动生成一个combobox倥件
    4.下面的问题便是如何把这个combobox放入dbgrid中
     ///////////////////////////////
    --- Delphi提供了功能强大的 DBGrid组件,以方便进行数据库应用程序设计。但是如果我
    们仅仅利用DBGrid组件,每一个获得焦点(Grid)只是一个简单的文本编辑框,不方便
    用户输入数据。Delphi也提供了一些其他数据组件来方便用户输入,比如DBComboBox,
    DBCheckBox等组件,但这些组件却没有DBGrid功能强大。Delphi能不能象Visual Foxpro
    那样让DBGrid中获得焦点网格可以是其它可视数据组件以方便用户呢?其实我们可以通
    过在DBGrid中插入其他可视组件来实现这一点。 ---- Delphi对DBGrid处理的内部机制,就是在网格上浮动一个组件--DBEdit组件。你
    输入数据的网格其实是浮动DBEdit组件,其他未获得焦点地方不过是图像罢了。所以,
    在DBGrid中插入其他可视组件就是在网格上浮动一个可视组件。因此任何组件,包括从
    简单的DbCheckBox到复杂的对话框,都可以在DBGrid中插入。下面就是一个如何在DBGrid
    中插入DBComboBox组件的步骤,采用同样的办法可以插入其他组件。 ---- 1、 在Delphi 4.0中新建一个项目。 ---- 2、 分别拖动的Data Access组件板上DataSource、Table,Data Controls组件板上DBGrid,
    DBComboBox四个组件到Form1上。 ---- 3、 设置各个组件的属性如下: rcf1 对象 属性 设定植
    Form1 Caption '在DBGrid中插入SpinEdit组件示例'
    DataSource1 DataSet Table1Table1 DatabaseName 'DBDEMOS'
    TableName 'teacher.DBF'
    Active TrueDBGrid1 DataSource DataSource1DBComboBox1 DataField 'SEX'
    DataSource DataSource1
    Visible False
    Items.Strings '男'| '女'
    ---- 注意:我在这里用了Teacher.dbf,那是反映教职工的性别,只能是“男”或者是“女”。 ---- 4、 DrawDataCell事件是绘制单元格,当获得焦点网格所对应的字段与组合框所对应
    的字段一致时,移动组合框到获得焦点的网格上,并且使组合框可视,从而达到在DBGrid
    指定列上显示DBComboBox的功能。设置DBGrid1的OnDrawDataCell事件如下: procedure TForm1.DBGrid1DrawDataCell
    (Sender: TObject; const Rect: TRect;
    Field: TField; State: TGridDrawState);
    begin
    if (gdFocused in State) then
    begin
    if (Field.FieldName = DBComboBox1.DataField ) then
    begin
    DBComboBox1.Left := Rect.Left + DBGrid1.Left;
    DBComboBox1.Top := Rect.Top + DBGrid1.top;
    DBComboBox1.Width := Rect.Right - Rect.Left;
    DBComboBox1.Height := Rect.Bottom - Rect.Top;
    DBComboBox1.Visible := True;
    end;
    end;
    end;
    ---- 5、 DBGrid指定单元格未获得焦点时不显示DBComboBox,设置DBGrid1的OnColExit
    事件如下: procedure TForm1.DBGrid1ColExit(Sender: TObject);
    begin
    If DBGrid1.SelectedField.FieldName 
    = DBComboBox1.DataField then
    begin
    DBComboBox1.Visible := false;
    end;
    end;
    ---- 6、 当DBGrid指定列获得焦点时DrawDataCell事件只是绘制单元格,并显示
    DBComboBox,但是DBComboBox并没有获得焦点,数据的输入还是在单元格上进行。在
    DBGrid1的KeyPress事件中调用SendMessage这个 Windows API函数将数据输入传输到
    DBComboBox上,从而达到在DBComboBox上进行数据输入。因此还要设置KeyPress事
    件如下: procedure TForm1.DBGrid1KeyPress
    (Sender: TObject; var Key: Char);
    begin
    if (key < > chr(9)) then
    begin
    if (DBGrid1.SelectedField.FieldName
    =DBComboBox1.DataField) then
    begin
    DBComboBox1.SetFocus;
    SendMessage(DBComboBox1.Handle, 
    WM_Char, word(Key), 0);
    end;
    end;
    end;
    ---- 程序在中文Windows 98,Delphi 4.015 下调试通过。希望本文能使你可以更加方便快
    捷的开发数据库应用程序。
      

  6.   

    to  eagle123(孤独的鹰) :
      谢谢你。
      你的方法在静态情况下是可以的,我知道。好几个兄弟都这么说,但是,我一直强调,我是动态取数据。
      问题在于我是动态的,即,不能吧ADO指向某表,只能用SQL语句,因为是
    多层开发。由于用SQL语句,则字段未知,那么不能使用字段编辑器。因此,你的方法不能解决我的问题。
      谢谢你。能有其他的办法吗?