延庆长城:VFP表格的刷新问题

来源:百度文库 编辑:中财网 时间:2024/05/03 10:18:36

为什么在每次刷新表格的时候,表格的格式总会自已改变??  
  (我已经在属性中把全部的格式都设为固定的了)

我是用SQL语句  
  比如说我想找值在1和3之间的所有数据,让它在表格中显示,(此时出现的格式和设计是一样))  
  可是当我再次查找值为5和8之间的数据时,在表格显示的格式就不一样,  
  显示出来的格子都比原来的小,好象都是和字段长度相同?  
  有什么办法可以解决呢????  
  或者要用视图??Top

两个解决方法:  
  1、用create   cursor创建一个同构cursor,将此cursor与grid绑定,  
        以后用zap,append   from命令将sql结果集追加到该cursor.  
  2、写一个form方法以编程方式实现sql语句的结果与grid的绑定,  
        每次执行sql后调用该方法。  
  推荐使用方式1。(不知7.0是否解决了这个问题,它的sql语句产生的cursor可以定义为可读写的)
VF7.0的SELECT命令可以生成可更新的临时表Top
 我采用的方法是:  
    把表格的数据源设为sql语句,然后在表格的refresh事件中  
    this.recordsource=‘select   *****   into   cursor   custs‘  
    表格的各项的长度不会有很大的变化。    
  Top

假如你选择的列是每次一样的。那么你可以添加固定列的grid,并且你也可以设置字体,宽度等。  
  代码:thisform.grid1.recordsource=""&&在重新生成数据源前,要先关闭表格的数据源  
              select   *   from   table   into   cursor   custs  
              thisform.grid1.recordsource="select   *   from   custs   into   custs"  
  如果选择的列是不一定的。  
              thisform.grid.recordsource=""  
              thisform.grid1.columncount=-1  
              select   *   from   table   into   cursor   custs  
              thisform.grid1.recordsource="select   *   from   custs   into   custs"  
            this.refreshTop


    
  方法2:在form上定义一个method:gridbinding,  
  仿照下列代码定义对grid的绑定,按你的方式,  
  每次数据源变化之后就调用这个方法。  
  (编程编程,不编怎么成!)  
  -------------------------------------------------------------  
  with   THISFORM.grid1  
  .RecordSource   =   "kmlist"  
  .COLUMNCOUNT   =   7  
  .column1.header1.CAPTION   =   ‘科目代码‘  
  .column2.header1.CAPTION   =   ‘科目名称‘  
  .column3.header1.CAPTION   =   ‘币种‘  
  .column4.header1.CAPTION   =   ‘标识‘  
  .column5.header1.CAPTION   =   ‘总分类帐‘  
  .column6.header1.CAPTION   =   ‘日记帐‘  
          .column7.header1.CAPTION   =   ‘建帐年份‘  
   
  .column1.Controlsource   =   "kmdm"  
  .column2.Controlsource   =   "km_chi_mc"  
  .column3.Controlsource   =   "wbdm"  
  .column4.Controlsource   =   "iif(km_bs=2,‘明细‘,‘汇总‘)"  
  .column5.Controlsource   =   "iif(zz_bs,‘是‘,‘   ‘)"  
  .column6.Controlsource   =   "iif(rjz_bs,‘是‘,‘   ‘)"  
  .column7.Controlsource   =   "curyear"  
   
  .column1.WIDTH   =   100  
  .column2.WIDTH   =   120  
  .column3.WIDTH   =   60  
  .column4.WIDTH   =   40  
  .column5.WIDTH   =   100  
  .column6.WIDTH   =   100  
  .column7.WIDTH   =   100  
           
          .setall("format","ZKT","column")  
  .gridlinecolor=rgb(64,128,128)  
  .setall("FONTSIZE",9,"header")  
          .setall("alignment",2,"header")  
  .readonly=.t.  
  endwith  
  thisform.refresh

首先确定一下,出现这个问题的原因是Grid的数据源"丢失"了,等你再重新设置的时候,Grid认为换了一个新的数据源,所以一切都重来了,你的Grid的表格自然变了。这个也不能算是vfp的BUG。  
  net_steven(吃素的狼)   的办法麻烦了一点,不过确实是保证不出问题。我的办法是在你刷新数据之前,先把Grid的数据源置空(Grid.RecordSorce=""),新的数据取来后,重新设置Grid.RecordSource和Column.ControlSource,然后刷新一下就行了(我一般把这一段程序作一个专用的方法——From.GirdReset())。Top

先设置好表格的数据源,以及列的宽度,字体等,recordsourcetype=别名,recordsource="lsb"  
  lsb先假设是该表格要显示的数据源  
   
  表单load时,确保该数据源已生成。  
   
  点查询  
  thisform.grid1.recordsource=‘‘  
      select   rsda.bh,xm,xb   from     table   where   aa>1   into   cursor   lsb  
  thisform.grid1.recordsource="lsb"  
   
  注意,你表格比如要显示bh,xm两列,但数据源中必须要有sno,bh,xm三列,则你必须写成bh,xm,sno,而不能写成sno,bh,xm,把显示不用的列写后面。Top

我也有一段代码、贴出来凑个数。(放在refresh前)  
   
  clmnwdth=90  
  FOR   nCnt   =   1   to   THISFORM.grid1.ColumnCount  
  do   case  
  case   nCnt   =   1  
  this.Columns(nCnt).width   =   clmnwdth  
  otherwise  
  this.Columns(nCnt).width   =   clmnwdth/3*4  
  endcase  
  ENDFOR