两个DBGrid A和B,A有较多记录,B只有一条记录是A现在指向的列.
B能仅显示这一列,并随A的指针移动而变化.(鼠标或其他方式移动都要反映出来)
特别是要把A做成只读的.对A进行Insert时,下面要给出一个空的记录;对A进行EDIT时能在B里EDIT;对A进行DELETE也是就上面的指针移动问题了.
我知道应该不难,关键是我不知道Delphi的指针是怎么用的,麻烦各位高手留个范例给小弟学习一下:)
B能仅显示这一列,并随A的指针移动而变化.(鼠标或其他方式移动都要反映出来)
特别是要把A做成只读的.对A进行Insert时,下面要给出一个空的记录;对A进行EDIT时能在B里EDIT;对A进行DELETE也是就上面的指针移动问题了.
我知道应该不难,关键是我不知道Delphi的指针是怎么用的,麻烦各位高手留个范例给小弟学习一下:)
解决方案 »
- 内存流的使用问题
- 用 winsocket api 函数来做网络程序,服务端怎么判断客户端已经断开连接?
- Delphi控制Excel,如何把Copy的资源释放?[在线等]
- 有谁考过Delphi 6程序员认证? 就这么多分了啊
- dbgrid的一个小问题
- 請問 published 定義的范圍?
- 在Delphi或js中怎么用access的参数查询?
- 如何在TreeView失去焦点时,让其所选的Node保持与其他的Node不同的区分颜色
- ListView中怎么把选中项显示到第一行
- 如何解决WPTools v6.29安装时出现的错误
- 哪里有通过网络点对点发送文件的源码下载,急急急急急急
- 如何实现自动发送图像???
可以在第一个dbgrid连接的adoquery的afterscroll事件中处理,思路是:
变量获得光标在的行的数据的主键的值 然后在该事件中
With ADOQuery2 Do
Begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM 表 WHERE 字段名称=:aa');
Parameters.ParamByName('aa').Value := adoquery1.FieldByName('字段名称').Value;
Open;
End;
这样就可以了
至于你后面的问题 既然你把a设为只读了 怎么还能够insert edit呢?请在明示!
With ADOQuery2 Do
Begin
filtered:=false;
filter:='字段名='+adoquery1.fieldbyname(‘字段名’).value;
filtered:=true;
End;
这个东西其实就是想控制用户直接输入在一个DBGrid里输入,所以为用户另外建了个DBGrid,不同的是,这个DBGrid只有一条记录.
再说清楚一点就是:两个DBGrid,A和B.想要他们同步显示数据库里的同一张表,A是只读的,对表的操作都在B里进行.而且要求B只显示一条记录,就是A现在指向的那条记录.
比如,一个用户想对A显示的表进行操作,那么他就要到专门为他准备的B上进行操作.如果是EDIT或DELETE,那么直接改就可以了.如果是INSERT,B里要显示一条空的记录给他填,而且象在A里填一样--提交,失败则回滚.
你的方法我试过了,EDIT和DELETE都可以,但是在INSERT的时候,因为adoquery1.FieldByName('字段名称').Value 还没有得到新记录的值,所以没有办法在B里给用户一个空的记录让他填.
---------------------------------------------------------------------------------
Erice(白雪公猪),你的方法实际和angle097113(深思不解)是一样的.
---------------------------------------------------------------------------------
lijccn(K') 你的方法好像没用,两个DBGrid都显示的是一样的.
不过我们做这个的时候一般都是用一个dbgrid和N个lable再加N个edit;^_^;
Tabel A,B
A.open
B.RecordSet=A.RecordSet建立A与B的主从关系(楼上说的:MasterFields设为相同名字的字段)这样可以保证你同步显示,致于其它的功能,自已觉得怎么做好,自己发挥了
建立两张表A,b,结构一样,A房数据,B是临时表,每次用完就清空,只放一条纪录.
编辑时,B表的记录和A表指向的纪录一样
删除时,A表删除指向的纪录,B表清空
增加时,B表增加一条空纪录,提交纪录时,把它追加到A表
用于编辑的,用DBEdit和DataSource每插入或编辑后,重做一次查询
而前一个设置为只读
在对后一个进行的每一种修改的同时
都刷新前一个在B的上下滚动的事件里面填写
A.refresh;
-----------------------------------------------------------------------------
love_me_forever(傻子),你的思路我想过,就是不会实现才来这里问的啊.
-----------------------------------------------------------------------------
47522341(睡到8:30) cwf555(cwf) tanqth(青蛙) xue2002yan(雪刺猬),其实我也是这样做的,但是最近觉得应该还有别的更好的办法.所以我就总是想弄明白Delphi的记录指针的使用,比如love_me_forever(傻子)的那种实现方法,而且我想应该不是很难的问题.只要知道A现在指向的记录(特别是INSERT的时候,自增长字段也是空的,所以一定要记录指针才可以实现),然后在B里显示,操作这条记录就可以了.而A是把DBGrid而不是Qrury设为Readonly就可以了.关键是我不会用记录指针.(随便问一下,Delphi里是不是有这个东东-__-)
-----------------------------------------------------------------------------
谢谢各位的回答,不过好像还没等到最满意的回答(记录指针的用法)
今天下午来结帖!!
何必把事情搞的这么麻烦呢做的太复杂
就把delphi的一些特性都放弃了
本末倒置
那么a与b两个dbgrid
a为只读
在table控件的afterscroll事件中
写上a.refresf
然后a与b就同步了如果数据源用query的话
就用updatesql和query 连用
控制其中几个字段的更新
删除和插入如果数据量很大
建议用query和updatesql连用如果不考虑速度
就用table
yiweijin(已未尽) ,你说的很有道理.其实我也是用别的方法实现的,但是我想如果可以弄懂这个问题的话以后做这方面就可以方便很多,我想我还是很乐意利用Delphi的特性的,只是要先知道这个特性才行:)