用DBGRID来显示查询结果(其datasource.dataset为adoquery1),用户可以选择grid显示哪些字段(通过右键弹出菜单)。我不想每改变一次显示/输出字段(一次只能增加或减少一个输出字段)都重新执行一次SQL查询,该怎么做呢?我的想法是:adoquery1先把所有字段都select出来,用户改变显示字段时只改变dbgrid显示的column,怎么实现?如果没办法通过DBGRID来实现,一个adoquery如何从另一个adoquery的查询结果中抽取特定字段呢?谢谢大家!!!!!

解决方案 »

  1.   

    DBGrid1.Fields[X1].Visible := true/false;
      

  2.   

    DBGrid1.Columns.Add;
      DBGrid1.Columns.Delete(Index);
      DBGrid1.Columns[2].FieldName := 'aaa';
      DBGrid1.Columns[2].Title.Caption := 'AAAAA';
      DBGrid1.Columns[2].Width := integer;
      

  3.   

    设计思想就是把所有字段全选出来,但可以不全部显示,只显示用户指定的列,方法主是DBGrid1.Fields[0(序号,从0开始)].Visible:=True或False;这句应该很简单吧.
      

  4.   

    如果是cjs5210(我是菜鸟)说的实现的功能的话 我估计的用Ini或者数据库来存储这些数据的吧
      

  5.   

    先添加所有字段至DBGrid,然后
    DBGrid1.Columns[I].Visible := True (Or False);
      

  6.   

    hlfhlf(小鱼) :是设定adoquery还是dbgird的字段不显示?我发现DBGrid1.Fields[0(序号,从0开始)].Visible:=True或False;不好用啊
    因为某个field的visible被置为false后,它就等于从DBGrid1.Fields数组中删除了
    我本来还想在popupmenu1的菜单项的click事件中加入一句呢:
    DBGrid1.Fields[i].visible:=popupmenu1.items[i].checked;
    比较麻烦呀~~不知道chao_jian(猫)的方法会不会有同样问题
      

  7.   

    用了chao_jian(猫)的方法:DBGrid1.Columns[I].Visible := True (Or False);
    实现了。谢谢!谢谢大家!
      

  8.   

    还有个问题:如果我想根据当前dbgrid1显示的字段来打印,怎么办?adoquery1已经选出了所有的字段,我就想用adoquery2根据dbgrid1.columns[i].visible来抽取adoquery1中的fields[i](这样我打印adoquery2中的数据就可以了),不知道这样的代码怎么写?有其他方法吗?
      

  9.   

    怎么用adoquery2根据dbgrid1.columns[i].visible来抽取adoquery1中的fields[i]???
      

  10.   

    想法正确,先全部加进来,想要哪列显示哪列
    dbgrid显示的column[i] visible
      

  11.   

    TO enova() ,采用临时表可以处理你的问题