关于dbgrid隐藏列的问题!请大家帮帮忙!谢谢!我已经想了好久的了! (50分)

W

winsock

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好,问一个动态隐藏dbgrid列的问题!数据库access+ado
在A表中包含程序全部字段,B表为一个进货表,我想让用户任意控制隐藏其中的某一列该如何做呢?
如:A表(dbgrid显示) B表(dbgrid2显示)
表 全部字段 隐藏 表 产品名称 产品规格 单位。。。。。
biao quanbu visible biao yjmc yjxh danwei
jhmx yjmc true jhmx 酒 红酒 斤
jhmx yjxh true jhmx 饮料 矿泉水 箱
jhmx danwei false
xsmx yjmc true
。。。。。。。。。
我的语句是这样写的。通过改变dbgrid1的visible字段内容,让dbgrid2列也改变
with adoquery1 do
begin
close;
sql.clear;
sql.Add('select * from A where biao="jhmx" and visible=true');
open;
if not adoquery1.eof then
// 问题就是接着我实在想不出要如何写好,我不知道怎么把quan字段下面的两
个yjmc,yjxh数据等于adoquery2的此两个字段,然后隐藏列!希望大家帮帮我!
谢谢了!
 
有点听不懂
隐藏的是哪个列呀,
 
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
with adoquery1 do
begin
close;
sql.clear;
sql.Add('select * from A where biao="jhmx" and visible=true');
open;
s:='';
if adoquery1.eof then
begin
s:=' '+trim(adoquery1.FieldbyName('quanbu').Asstring) ;
next;
while not(adoquery1.eof) do
begin
s:=s+','+trim(adoquery1.FieldbyName('quanbu').Asstring);
next;
end;
if s[length(s)]=',' then s:=copy(s,1,length(s)-1);
end;
close;
Sql.clear;
end;

if length(s)>0 then
with Adoquery2 do
begin
close;
sql.clear;
sql.Add('select '+s+' from jhmx ');
open;
end;
end;
 
你可以全部选出来,然后不在dbgrid里显示就可以了
 
谢谢,jsxjd了,你的回答很好,可问题就是我想让dbgrid的列隐藏,也就是最后dbgrid2要
显示为:
表 单位
biao danwei
jhmx 斤
jhmx 箱
这两列显示出来,而yjmc,yjxh这两列隐藏!谢谢了!
adoquery2.FieldByName(s).Visible:=true;
我只是在最后加了这样一句,老是提示adoquery2.field'ID'not found
 
先取得列号i;
然后 dbgrid2.columns.visible:=false;
 
to:wy0311
我已经去取了,问题还是没有显示呀!
 
把ADOQUERY2中所有列的VISIBLE设置为FALSE

如CLICKED时:
ADOQUERY2.Open;
ADOQUERY2列名1.Visible :=true;
ADOQUERY2列名2.Visible :=true;

 
来个假隐藏吧~列把宽度设置为1(0好像不行)。。。。。。。。。
 
各位朋友,还是不行呀,因为我A表quanbu字段中存放着程序所有的字段。我是想通过打开相应的窗口(如:进货窗口)
通过查询A表中的数据后,来判断dbgrid列是否隐藏。谢谢了各位了!
 
在DBGRID1的ONDRAWCOLUMNCELL事件中添加:

dbgrid2.datasource2.dataset.fieldbyname(dbgrid1.datasource1.dataset.fieldbyname('quanbu').asstring).visible
:=dbgrid1.datasource1.dataset.FieldByName('visible').Asboolean;
dbgrid1.ondrawcolumncell:=nil;//必需写的.
没有时间调试.自己试清楚吧.基本上改改就可以了.有时间帮我UP.或者灌水.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1435628
 
adoquery1.first;
while not(adoquery1.eof) do
begin
for i := 0 to adoquery2.FieldCount - 1 do
if adoquery1.FieldByName('quanbu').asString=adoquery2.Fields.FieldName
then dbgrid2.columns.visible:=false;
//也可 adoquery2.Fields].visible:=false;
adoquery1.next;
end;
这个没什么好说的么,不过我发现各位答题都不先仔细审题的
或者是答时离题万里,不过up也有分么,就打个关注(GZ)就可以了
A是控制B的列的开关,比较字段名,如在A查询结果中的隐藏
 
接受答案了.
 
顶部