关于数据显示的问题(重分求解)(200分)

  • 主题发起人 主题发起人 dcba
  • 开始时间 开始时间
D

dcba

Unregistered / Unconfirmed
GUEST, unregistred user!
假设我有一张表AAATable; 结构如下:
name:char(10)
workSN:int(BBBTable 里的SN)
内容为:
zhang 1
wang 3
li 2
qiu 2
有一张表BBBTable
SN:int
workName:char(10)
1 gongzuo1
2 gongzuo2
3 gongzuo3

现在我想建一个窗体能像dbgrid那样,一行行,把所有人的信息(name,work)显示出来,但是要求在
显示work时,不实现数字,而是显示对应的bbbTable 的workName 即:
zhang gongzuo1
wang gongzuo3
li gongzuo2
qiu gongzuo2
用Master/Detail方式可以实现么?
还有就是,在显示的工作这一栏,可以做成ComboBox样子,点击后可以列出所有的工作,然后选择更改
[red]唯一的要求就是用TADOQuery实现,最好能用DBCtrlGrid和DBLookUpComboBox或DBLookUpListBox实现[/red]
 
不用主从表也可以,你将ado连接好数据库之后,而且连接了DBGRID
ADOQUERY1.sql.clear;
adoquery1.sql.add('select aaaTable.name, BBBTable.workname from aaaTable,BBBTable');
adoquery1.sql.add('where BBBTable.sn=aaaTable.wokesn');
adoquery1.open;
 
徐永进:
你的意思我明白,但是这样只能实现我的第一个要求,我最需要的是能以下来列表方式显示所有的工作的可选择的值,
并能像dbgrid那样,把所有人的记录都显示出来
 
思路应该很简单,将起来稍微麻烦。
先说第一步:
master detail可以,就是把第二个adoquery的datasource设置城第一个的datasource,同时
第二个的sql语句用带有参数的,并且要让这个参数名字等于第一个adoquery中的那个表的
worksn,即:worksn,不过你可以考虑用一个连接查询搞定,
[blue]
select a.name, b.workname
from aaatable a, bbbtable
where a.worksn=b.sn
[/blue]
你所说的第二个问题我给你两种方法:
第一种就是用dblookupcombobox,我提示一点,它需要两个adoquery,两个datasource,
不过我不建议用这个东西,太麻烦,而且不够灵活,不能方便的添加一些查询结果集中没
有的对照,比如增加<空> <目前没有>;
第二种用那个dev express的控件,装上其中那个QuantumGrid,然后你就有了三组控件,其中
一组是dxEdit,不是db的那组,其中有个控件,叫dxPopupEdit,这个东西很好玩,不过比较
难用,它可以把任何一个wincontrol的东西作为它的popupControl,只要点击了下拉框,就可以
弹出来,然后你就做一个dxDBGrid(也是这个控件包的一个),用连接查询,查出来之后作为Popupcontrol
就行了。
以上两种我都用过,感觉还是dev Express的控件好用
 
在显示的工作这一栏,可以做成ComboBox样子:
在DBGrid1DrawDataCell中
if (gdFocused in State) then
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.Visible :=True;
end;
在DBGrid1ColExit中
if DBGrid1.SelectedField.FieldName = DBCombobox1.DataField then
begin
DBCombobox1.Visible := false;
end;
 
双及DBGrid,添加column,设置好field,
>>在显示的工作这一栏,可以做成ComboBox样子
DBGrid有picklist可以直接用。
QUERY1.close;
QUERY1.sql.clear;
query1.sql.add('select workname from BBBTable');
query1.open;
for i:=0 to Query1.RecordCount-1 do
DBGrid1.Columns[0].PickList.Add(Query1.fieldvalues['workname']);
 
sadj你的方法正是我想要得,但是有些地方我还不太清楚,你能详细告诉我dbcombobox的用法么?或者给我个例子吧,先写写了。
感谢所有回答的人,等我搞定以后,人人都有分
 
DBComboBox不好玩,
用DBGrid的picklist为什么不行?
DBGrid本身就支持类似combobox的选项方式阿。
 
如果不用dbcombobox,我想直接在dbgrid某个人的workname里选择另外一个workname,来自动修改数据库AAATable中某人的workSn数据,好像办不到呀
还有就是sadj你说的设置第二个adoquery的datesource为第一个datesource,但是我设置了以后,dbgrid里只能显示出姓名,而工作名显是不出来。
sql是这样设置的:
adoquery1:
select name,worksn from AAATable
adoquery2:
select workName from BBBTable where SN=:WorkSn
 
首先放两个Tquery,query1连AAATable,query2连BBBTable ,双击query1进入字段编辑器,
选择所有字段,然后右键new field 添加一个Lookup字段, key field:worksn,目的数据
源为query2,lookup field :sn, display field :workname。 ok
 
用lookup字段就行了,简单得很.
详细过程看看帮助就可以了.
就是在字段列表中增加字段时选择lookup字段的.然后利用
两个表的关键字段来连接并显示.
 
那[red]具体[/red]是怎样实现的呢?
 
原来的问题是解决了,但是又产生了新的问题:我是这样写得的
在dbgrid1.columns里设定量各字段,name workname,其fieldName分别为:name和workname
dbgrid1.datesource:=datesource1; datesource1.dateset:=adoquery1;
adoquery1.sql为'select name, workname from AAATable, BBBTable where worksn=sn
然后设定adoquery1.connectstring,设定adoquery1.active:=true
这样显示如下:
name workname
zhang gongzuo1
wang gongzuo3
li gongzuo2
qiu gongzuo2
然后
在DBGrid1DrawDataCell中
if (gdFocused in State) then
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.Visible :=True;
end;
在DBGrid1ColExit中
if DBGrid1.SelectedField.FieldName = DBCombobox1.DataField then
begin
DBCombobox1.Visible := false;
end;
但是我如何更新数据呢?(假如用户在combobox下拉表里选了另外一个)

 
ok
问题解决了
十分感谢所有的人,人人有分
 
后退
顶部