先讨论控件源。在关闭数据源后,grid会失去控件源,变白。这时,一般都要进行数据源的重新绑定。
  数据源的绑定方法大家可以交流交流。然后大家总结以下哪中最好。这样就有了讨论的成果。

解决方案 »

  1.   

    在表结构相同的情况下,我喜欢用临时表,开始时绑定,然后APPE 
    否则,我就只有 with this.grid1 
                    .column1=...
                    .column1.header1.caption=...
                  end with
    希望看到好的方法哪,
    还有我有一个疑问,当columncount为-1时只要设了数据源就可以显示该表所有的字段内容,可以筛选,有时觉得这样这够了,可主要是,字段名是英文的,可表格标题上显示给客户的又要是中文的,有没有什么办法可以让标题直接显示为中文,这样有时可以不一项一项的去设column、caption之类了.在数据库的标题里都为各字段注明了中文,真希望可以用上
      

  2.   

    用久了还是觉得代码方便,我一般都在自定义的form类中加一个binding
    方法,其中以代码方式控制控件的属性,甚至可以将需要绑定的属性值
    存到客户端的表里,这样既灵活易于控制,复用性也很好。
      

  3.   

    liuri(璇玑) 出了个题、能那样当然好
      

  4.   

    liuri提的问题确实是grid的一个麻烦的问题。我也一直都只有一列列的设。
      

  5.   

    控件源的处理,一般来说要显示的列还是固定的。只是重新生成数据源的时候,会失去和数据源的联系。我的处理方法一般都是重新绑定。而重新绑定又有recordsourcetype=别名和sql说明两种。
     
      为别名时,grid中只要不改了其他属性,是可以直接修改控件源的。当重新生成数据源时,比如pack了或者select into覆盖了该控件源。如果能使该控件源中顺序和你grid中column的controlsource属性顺序一致的话,就不需要一列列的进行设置。
       例,grid的recordsource为table1,列的controlsource属性为
        column1     aa
        column2     bb

        thisform.grid1.recordsource=''&&先关闭grid的控件源,防止空白。
        select aa,bb from table2 where aa=9 into table table1 
        thisform.grid1.recordsource="table1"
    这时由于新生成的table1和grid1的列顺序是一致的。上面的代码就可以了。而不需要一列列的用代码在进行绑定。但select bb,aa from table2 where aa=9 into table table1就不一样了。就要用代码每列的设过去。所以,我们就可以把重新生成数据源的sql语句中的列顺序保持和grid一致。把不在表格中显示的在select的字段列表的后面去。避免每列绑定。
      

  6.   

    sql说明的处理不一样。用了sql说明,grid控件中的内容是只读的。
    thisform.grid1.recordsource=''
    select aa,bb from table into cursor lsb
    thisform.grid1.recordsource="select aa,bb from lsb into cursor lsb"
      

  7.   

    无意中发现:双击此论坛页面,会放电影!  :)
    我在正在考虑这个问题。做数据库时其实字段的标题就可以注释一下,在GIRD中会被默认加以显示,不过在数据库字段在程序中让用户修改后,如何实现这种“自动”效果?
    另外,表格的宽度(界面)用户调整后应该能保存下来便于下次打开时是新界面,我正在集中保存界面的代码,稍候发出来共享
      

  8.   

    看到net_steven(吃素的狼) 说把设置存在表里,我突然想,能不能做一个函数,在表单的init中运行这个函数,这个函数就是记录GRID的设置并记录到一个临时表中,然后,以后,当我们要重设数据源时,再搞个读临时表到GRID设置的,这样,以后任何表单都不需要重进行数据源设置了,
    想法而已:)
      

  9.   

    这个还是不能解决我开始说的问题,但这样,对于要重设数据源的步骤就都可以省略,我想设表的结构就包括contrilsuorce,caption,width,fontname,...等等吧,根据自己的程序而定,然后记录数就等于columncount的数目
    用一个循环写入,再来一个函数,用循环读出,
      

  10.   

    to liuri:
       我想用循环的话,可以是肯定可以。但可能会影响开发的速度。所以我觉得header还是手动修改一下。或者用select field1 as 字段1 。还是等微软改进这个控件吧。我觉得vfp的grid最主要的问题还是在控件源的重新绑定上。另外一个问题就是多表头的处理上。提醒初学者,在程序中对控件源不要pack.应该是set dele on 在退出程序时再pack。以免出现空白问题。
      

  11.   

    with this.grid1 
            .column1=...
            .column1.header1.caption=...
     end with
      

  12.   

    大家可以去下那个表格控件看看,我觉得挺好的。
    http://honghoo.net/openurl.asp?id=353
    现在主要是使用上还不熟。
      

  13.   

    其实column也是一个类来的。大家可以动态定义。如果你字段在数据库中有标题,或者你有一个数据字典的表,那么产生column的时候,这个类会自动去处理caption的问题。给一个例子你们看:*---- 当点击列的题头的时候对表格进行临时排序
    DEFINE CLASS AutoColumn As Column 
       ADD OBJECT Header1 As Header WITH AlignMent = 2
       ADD OBJECT Text1 As BaseTextBox WITH AlignMent = 2 
       *-------  列对应的字段
       PROTECTED oHooker
                 oHooker = .NULL.
       
       
              
       PROCEDURE Init
           LPARAMETERS toFieldHooker
           
           This.oHooker = toFieldHooker
           
           
           
            WITH This
                .ControlSource = toFieldHooker.oDataControl.ControlSource
                .Width = toFieldHooker.oDataControl.Width
                .Enabled = toFieldHooker.oDataControl.Enabled           
                .Header1.Caption = toFieldHooker.lblFields.Caption
                                                
                *---- 如果在主界面是组合框
                IF UPPER(toFieldHooker.oDataControl.BaseClass) = [COMBOBOX]
                  .AddObject([oComboBox] ,[GridComboBox])
                  .oComboBox.SpecialEffect = 1
                  *---- 添加记录                               
              FOR i = 1 TO toFieldHooker.oDataControl.ListCount
                    .oComboBox.AddItem(toFieldHooker.oDataControl.List(m.i))           
              ENDFOR 
              .CurrentControl = [oComboBox]
                ENDIF 
             ENDWITH 
                        
       ENDPROC 
       
       
       *---- 修改
       PROCEDURE Modify
               This.Enabled = This.oHooker.oDataControl.Enabled              
       ENDPROC  
       
             
       *---- 操纵
       PROTECTED PROCEDURE Text1.When
           *  This.Parent.oHooker.oDataControl.When()
       ENDPROC 
       PROTECTED  PROCEDURE Text1.Valid
             *This.Parent.oHooker.oDataControl.Valid()
       ENDPROC 
       PROCEDURE GetFInfo
           RETURN This.oHooker.GetFInfo()
       ENDPROC 
       
       PROCEDURE Header1.Click
              
              loFInfo = This.Parent.GetFInfo()
              
              IF INLIST(loFInfo.Type ,[M] ,[G])
                 SET MESSAGE TO [此字段类型不能排序]
                 RETURN 0
              ENDIF 
              
              
              *---- 对合法排序类型进行排序
              oColumn = This.Parent.Parent.oTempOrderColumn
              IF VARTYPE(oColumn) = [O] AND NOT ISNULL(oColumn)
                 oColumn.RestoreFromOrder()
              ENDIF 
              *---- 保留原来的标题
              IF EMPTY(This.Tag)                    
                 This.Comment = This.Caption
              ENDIF 
              IF EMPTY(This.Tag) OR This.Tag = [ASCENDING]      
                
                 cDirection = [ASCENDING]
                 
                 This.Caption = [↑] + This.Comment
                 This.Tag =  [DESCENDING] 
              ELSE 
                 cDirection = [DESCENDING]
                 
                 This.Caption = [↓] + This.Comment
                 This.Tag = []
              ENDIF 
              This.ForeColor = 8388608
              This.FontBold = .T.
              
              cTag = [tag]
              
              *---- 防止null值引起系统错误
              cOrder = [NVL(] + This.Parent.ControlSource + [,'')]
              
              *---- 排序一定范围里的记录
              lcCondition = ALLTRIM(ThisForm.cFilterCondition)
              
              IF NOT EMPTY(lcCondition)
                 INDEX ON &cOrder TAG &cTag &cDirection FOR &lcCondition
              ELSE 
                 INDEX ON &cOrder TAG &cTag &cDirection 
              ENDIF 
              
              This.Parent.Parent.oTempOrderColumn = This.Parent 
              
              This.Parent.Parent.Refresh()
       ENDPROC 
       *---- 双击时显示详细
       PROCEDURE text1.dblClick
               ThisForm.ShowForm()
     
       ENDPROC 
       
       PROCEDURE RestoreFromOrder
              This.Header1.Caption = This.Header1.Comment
              This.Header1.ForeColor = RGB(0,0,0)   
              This.FontBold = .F.
       ENDPROC 
       
       PROCEDURE Destroy
              This.oHooker = .NULL.
       ENDPROC 
    ENDDEFINE 
      

  14.   

    针对多表头的处理问题,我想出一个方法,不知是否可能,也请大家探讨。把显示和修改分开来实现:
    显示:就是直接用SQL语句(或直接绑定数据源的方式)来实现,不过这样的问题是在做数据输入时比较吃力;那么在
    修改(或录入):在GRID控件中直接添加一个新的控件,如TEXT、COMBO控件等,如果想在整个列中使用此控件,可以考虑用代码添加。(效果如同创建数据表时的窗口),这样在新的控件上指定数据源是否就可以避免了一些冲突呢?而且还可以增加了GRID控件的可扩展性,不知此法是否可行?!
      

  15.   

    我好笨啊, coolyylu(将来是我)的代码我还没看懂啊!~
    另外,我还有一个问题,我想也是大多数初学者都遇到过的,就是在表格中,如果用表格来显示数据表中数据,那么如何用单独的一列来显示记录的序号,并要求与所在行的数据想对应,有什么简单的方法或程序吗?!~
      

  16.   

    to 小魏:增加一列,用recno()
      

  17.   

    vfp8会提供象excel的电子表格的grid控件
      

  18.   

    哪里可以看到关于VFP8的相关信息?!~
      

  19.   

    (转贴)通常, ColumnCount 属性值为 -1 的表格将使用 Caption 属性来决定列使用的标题. 但是, 如果你指定了列数, 标题将取决于 header 对象的 Caption, 而不是 ControlSource 字段的 Caption 属性. 以下代码放入到一个 grid 的 Init 事件中将在表格创建时设置 grid 标题为字段的 Caption :    LOCAL iLoop, iMax, cSource   SET DATABASE TO <<insert databasename here>>   WITH This
          && 检查 Grid 的列数
          iMax = .ColumnCount      && 得到表格使用的表的表名
          && 这是必须的因为没有连接到文本框控件,
          && 列的 ControlSource 属性是以表名开始而不是以字段名开始,
          && 因此必须用代码来完成该工作. 注意包含的 ".".
          cSource = .RecordSource + "."      && 遍历各列
          FOR iLoop = 1 TO iMax
             WITH .Columns(iLoop)            && 设置列的 Caption
                .Header1.Caption = DBGETPROP( cSource + .ControlSource,"FIELD", "CAPTION" )
             ENDWITH
          NEXT iLoop
       ENDWITH  
      

  20.   

    请问在远程视图中怎样删除一个记录,我用DELE和PACK运行后,系统显示PACK不支持远程视图。
      

  21.   

    在远程视图只要delete,不需要pack。因为远程视图不像vfp表一样存在物理记录。它是虚拟的。只要发出tableupdate(0,.t.)或者关闭远程视图后,就会起到pack的作用
      

  22.   

    我有用delete试过了,删除的效果不理想,例如:我新添加的记录不能删除,而且有时我VFP中远程视图的记录没有删除,而SQL表中的记录却删除了