在表结构相同的情况下,我喜欢用临时表,开始时绑定,然后APPE 否则,我就只有 with this.grid1 .column1=... .column1.header1.caption=... end with 希望看到好的方法哪, 还有我有一个疑问,当columncount为-1时只要设了数据源就可以显示该表所有的字段内容,可以筛选,有时觉得这样这够了,可主要是,字段名是英文的,可表格标题上显示给客户的又要是中文的,有没有什么办法可以让标题直接显示为中文,这样有时可以不一项一项的去设column、caption之类了.在数据库的标题里都为各字段注明了中文,真希望可以用上
为别名时,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的字段列表的后面去。避免每列绑定。
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"
to liuri: 我想用循环的话,可以是肯定可以。但可能会影响开发的速度。所以我觉得header还是手动修改一下。或者用select field1 as 字段1 。还是等微软改进这个控件吧。我觉得vfp的grid最主要的问题还是在控件源的重新绑定上。另外一个问题就是多表头的处理上。提醒初学者,在程序中对控件源不要pack.应该是set dele on 在退出程序时再pack。以免出现空白问题。
with this.grid1 .column1=... .column1.header1.caption=... end with
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]
否则,我就只有 with this.grid1
.column1=...
.column1.header1.caption=...
end with
希望看到好的方法哪,
还有我有一个疑问,当columncount为-1时只要设了数据源就可以显示该表所有的字段内容,可以筛选,有时觉得这样这够了,可主要是,字段名是英文的,可表格标题上显示给客户的又要是中文的,有没有什么办法可以让标题直接显示为中文,这样有时可以不一项一项的去设column、caption之类了.在数据库的标题里都为各字段注明了中文,真希望可以用上
方法,其中以代码方式控制控件的属性,甚至可以将需要绑定的属性值
存到客户端的表里,这样既灵活易于控制,复用性也很好。
为别名时,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的字段列表的后面去。避免每列绑定。
thisform.grid1.recordsource=''
select aa,bb from table into cursor lsb
thisform.grid1.recordsource="select aa,bb from lsb into cursor lsb"
我在正在考虑这个问题。做数据库时其实字段的标题就可以注释一下,在GIRD中会被默认加以显示,不过在数据库字段在程序中让用户修改后,如何实现这种“自动”效果?
另外,表格的宽度(界面)用户调整后应该能保存下来便于下次打开时是新界面,我正在集中保存界面的代码,稍候发出来共享
想法而已:)
用一个循环写入,再来一个函数,用循环读出,
我想用循环的话,可以是肯定可以。但可能会影响开发的速度。所以我觉得header还是手动修改一下。或者用select field1 as 字段1 。还是等微软改进这个控件吧。我觉得vfp的grid最主要的问题还是在控件源的重新绑定上。另外一个问题就是多表头的处理上。提醒初学者,在程序中对控件源不要pack.应该是set dele on 在退出程序时再pack。以免出现空白问题。
.column1=...
.column1.header1.caption=...
end with
http://honghoo.net/openurl.asp?id=353
现在主要是使用上还不熟。
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
显示:就是直接用SQL语句(或直接绑定数据源的方式)来实现,不过这样的问题是在做数据输入时比较吃力;那么在
修改(或录入):在GRID控件中直接添加一个新的控件,如TEXT、COMBO控件等,如果想在整个列中使用此控件,可以考虑用代码添加。(效果如同创建数据表时的窗口),这样在新的控件上指定数据源是否就可以避免了一些冲突呢?而且还可以增加了GRID控件的可扩展性,不知此法是否可行?!
另外,我还有一个问题,我想也是大多数初学者都遇到过的,就是在表格中,如果用表格来显示数据表中数据,那么如何用单独的一列来显示记录的序号,并要求与所在行的数据想对应,有什么简单的方法或程序吗?!~
&& 检查 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