`
bolutes
  • 浏览: 868474 次
文章分类
社区版块
存档分类
最新评论

vsflexgrid技巧大全

 
阅读更多
如何实现将vsflexgrid中修改的数据反馈到数据库中??
PrivateSubvsflexgrid1_AfterEdit(ByValRowAsLong,ByValColAsLong)
rs.MoveFirst'//rs为记录集
rs.Movevsflexgrid1.Row-1
rs.Edit
Ifvsflexgrid1.text=""Then
rs.Fields(vsflexgrid1.Col-1)=Null
Else
rs.Fields(vsflexgrid1.Col-1)=vsflexgrid1.text
EndIf
rs.Update
endsub


一、增加记录使用for来循环表格行。
fori=1togrid1.rows-1
withrs
.addnew
.fileds(o)=grid1.textmariy(i,0)
.fileds(1)=grid1.textmariy(i,1)
.fileds(2)=grid1.textmariy(i,2)
.fileds(3)=grid1.textmariy(i,3)
.update
endwith
next
二、添加行
  grid1.additemrow
三、删除当前行
  withgrid1
i=.row
.removeitemi
endwith
四、要显示下拉框,可以使用vsflexgrid中列绑定功能
  grid1.colcombolist(1)=grid.buildcombolist(rs,"商品名称")
跟楼上的相比,仅仅是datamode不一样(2-flexDMBoundBatch)
但这样做的优势是非常明显的:可以撤销包括新增删除在内的所有操作,按保存键才写入数据库
PrivateSubCmdDel_Click()
Iffg.Row<>0Thenfg.RemoveItem(fg.Row)
fg.Refresh
EndSub
PrivateSubCmdAdd_Click()
OnErrorResumeNext
Adodc1.Recordset.AddNew
IfErr.Number<>0ThenMsgBoxErr.Description
EndSub
PrivateSubCmdUpdate()
Adodc1.Recordset.UpdateBatchadAffectAllChapters
EndSub
PrivateSubCmdCancel_Click()
Adodc1.Recordset.CancelBatch
fg.DataRefresh
EndSub

PrivateSubForm_Load()
Adodc1.ConnectionString="FILENAME="&App.Path&"/conn.dsn"
Adodc1.LockType=adLockBatchOptimistic
Adodc1.RecordSource="Your_Tablename"
Setfg.DataSource=Adodc1
EndSub

1、打印vsflexgrid可以使用vsprinter打印控件。跟vsflexgrid配套使用效果不错。
2、导出EXECL,可以使用grid.savegrid的方法。
用savegrid的方法,在导出execl时,如果碰到类似于银行帐号的列如:“6465456665”,导到EXECL中就不这样显示了,这个问题还不知道怎么解决??
另外也可以写代码(这个方法比较实用,但慢一些):
DimexcelAppAsExcel.Application
SetexcelApp=NewExcel.Application
OnErrorResumeNext
IfexcelAppIsNothingThen
SetexcelApp=CreateObject("Excel.application")
IfexcelAppIsNothingThen
ExitSub
EndIf
EndIf
excelApp.Visible=True
Me.MousePointer=vbHourglass
excelApp.Workbooks.Add
WithexcelApp.ActiveSheet
DimiAsInteger,jAsInteger
Fori=1ToGrid1.rows
Forj=1ToGrid1.Cols
.Cells(i,j).value="'"&Grid1.TextMatrix((i-1),(j-1))'加上“'”号则可以解决上面savegrid中银行帐号的导出问题。
Nextj
DoEvents
Nexti
EndWith
Me.MousePointer=vbDefault
SetexcelApp=Nothing
EndSub
EXCEL同Vsflexgrid通过
最近很多的朋友,都想知道EXCEL怎样同VSflexgrid交换数据。
实际上,利用“复制”、“粘贴”菜单即可实现。具体如下:
(1)在Vsflexgrid上弹出右键菜单
PrivateSubgrid1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,yAsSingle)
ifButton=2ThenPopupMenumnutccd
EndSub
(2)设置各菜单的内容
A复制
Clipboard.Clear
Clipboard.SetTextgrid1.Clip
B剪切
DimrowcAsLong
DimrowzAsLong
DimcolcAsLong
dimcolzAsLong
dimiaslong
dimsaslong
Ifgrid1.Rows=1ThenExitSub
Clipboard.Clear
Clipboard.SetTextgrid1.Clip
Ifgrid1.RowSel>grid1.rowThen
rowc=grid1.row
rowz=grid1.RowSel
Else
rowc=grid1.RowSel
rowz=grid1.row
EndIf
Ifgrid1.ColSel>grid1.ColThen
colc=grid1.Col
colz=grid1.ColSel
Else
colc=grid1.ColSel
colz=grid1.Col
EndIf
Fori=rowcTorowz
Fors=colcTocolz
grid1.TextMatrix(i,s)=""
Next
Next
C粘贴(精华部分)
DimiAsLong
DimsAsLong
DimmAsLong
DimtAsLong
Ifgrid1.Rows=1ThenExitSub
t=Len(Clipboard.GetText)
Ift=0ThenExitSub
Fori=1Tot
IfMid(Clipboard.GetText,i,1)=Chr(9)Thens=s+1
IfMid(Clipboard.GetText,i,1)=Chr(13)Thenm=m+1
Next
Ifs/(m+1)+grid1.Col>grid1.Cols-1Then
grid1.ColSel=grid1.Cols-1
Else
grid1.ColSel=s/(m+1)+grid1.Col
EndIf
Ifgrid1.row+m>grid1.Rows-1Then
grid1.RowSel=grid1.Rows-1
Else
grid1.RowSel=grid1.row+m
EndIf
grid1.Clip=Clipboard.GetText



VSFlexGrid常用属性或方法:
.FixedRows=1'固定几行
.FixedCols=1'固定几列
.Editable=True'允许修改
.AllowUserResizing=flexResizeBoth'可调整行/列
.FocusRect=flexFocusNone'无虚框
.SelectionMode=flexSelectionListBox'焦点选中样式
.BackColor=RGB(255,255,255)'单元背景色
.BackColorSel=vbBlue'单元选择色
.BackColorFixed=RGB(208,192,160)'固定单元色
.BackColorAlternate=RGB(255,250,230)'间隔行背景色
.GridColor=RGB(245,240,210)'单元线条色
.ForeColor=RGB(0,0,0)'单元前景色(字符色)
.RowHeightMin=260'最小行高
.RowHeightMax=800'最大行高
.ColHeightMin=50'最小列宽
.ColHeightMax=3000'最大列宽
.ColWidth(Col)=1000'指定列宽
.RowHeight(Row)=260'指定行高
.TextMatrix(Row,Col)="Text"'指定单元字符
.Text="Text"'选定单元字符
.MergeCol(Col)=True'允许合并列
.MergeRow(Row)=True'允许合并行
.MergeCells=0|1|2|3|4|5|6'合并选项
.Cell(选项准则,Row1,Col1,Row2,Col2)'选择部分的相应准则值
.EditCell'当移动到当前单元时自动选择
.EditSelStart'移动到单元时的光标位置
.MousePointer'设置对象的鼠标指针样式O.A=0到15|99
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
几个特殊的属性方法的使用:
FormatString属性:管道符格式化字符串示例:
下面定义对齐方式同字意,列宽窄同距离
VSG1.FormatString="^中|<左|>右|>右|^中"
+++++++++++++++++++++++++
搜索(查找)表格中符合条件的行:
FindRow属性:该属性返回一个行值
MsgBoxVSG1.FindRow(关键词,[指定行],[指定列],[敏感],[精度])
关键词:String,表示要搜索的字符串
指定行/指定列:Long,表示只在指定的行或列中找
敏感:Boolean,
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'限制只能在指定列输入(这里默认倒数第2列)
PrivateSubVSG1_BeforeRowColChange(ByValOldRowAsLong,_
ByValOldColAsLong,ByValNewRowAsLong,_
ByValNewColAsLong,CancelAsBoolean)
VSG1.Editable=flexEDKbd
IfVSG1.Redraw<>flexRDNoneAndNewCol<>VSG1.Cols-2Then
Cancel=True
VSG1.SelectNewRow,VSG1.Cols-2
EndIf
EndSub
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
限制不能编辑某些列:(这里限制第1列和第3列)
PrivateSubVSG1_RowColChange()
IfVSG1.Col=1OrVSG1.Col=3Then
VSG1.FocusRect=flexFocusNone
VSG1.Editable=flexEDNone
'SendKeys"{TAB}"
Else
VSG1.Editable=flexEDKbd
SendKeys"{ENTER}"
EndIf
EndSub
或:
PrivateSubVSG1_RowColChange()
IfVSG1.Col=1OrVSG1.Col=3Then
SendKeys"{RIGHT}"
Else
SendKeys"{ENTER}"
EndIf
EndSub
或:
PrivateSubVSG1_RowColChange()
IfVSG1.Col=1OrVSG1.Col=3Then
VSG1.Editable=flexEDNone
Else
VSG1.Editable=flexEDKbd
VSG1.EditCell'自动选择单元内容
VSG1.EditSelStart=0[选到最前]|1[选到指定]|Len(VSG1.Text)[选到最后]
EndIf
EndSub
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'对齐方式(-1标示所有)
.ColAlignment(-1)=flexAlignLeftCenter|flexAlignCenterCenter|flexAlignRightCenter
示例1:(最后一行的第3列靠右对齐)
VSG1.SelectVSG1.Rows-1,2
VSG1.CellAlignment=flexAlignRightCenter
示例2:
VSG1.Row=VSG1.Rows-1:VSG1.Col=1
VSG1.CellAlignment=flexAlignRightCenter
示例3:
VSG1.Cell(flexcpAlignment,VSG1.Rows-1,1,VSG1.Rows-1,3)=flexAlignRightCenter
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
本对象拖放:
PrivateSubVSG1_MouseDown(ButtonAsInteger,_
ShiftAsInteger,XAsSingle,YAsSingle)
VSG1.Drag
VSG1.DragIcon=LoadPicture("D:/Icon.ico")
VSG1.DragRowVSG1.RowSel
EndSub
或从其它对象拖:
PrivateSubVSG2_MouseDown(ButtonAsInteger,_
ShiftAsInteger,XAsSingle,YAsSingle)
VSG2.OLEDrag
VSG1.OLEDropMode=flexOLEDropAutomatic
EndSub
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PublicSubVSGridCount(OptionalSelRowAsLong,OptionalSelColAsLong)
DimXAsLong,iAsLong
DimHj1,Hj2,Hj3AsString
ConstA1=-922337203685477#,A2=922337203685477#
OnErrorGoToErrTransact
WithfrmFG.VSG1
X=.Rows-1
.MergeCells=flexMergeFree
.MergeRow(X)=True
.Cell(flexcpText,X,0,X,1)="合计"
If.Rows=3Then
.TextMatrix(X,0)=0
.Cell(flexcpText,X,2,X,14)=""
.Cell(flexcpText,X,16,X,17)="¥0.00"
ExitSub
EndIf
'Hj1=Val(.Aggregate(flexSTSum,2,2,X-1,2))
'Hj2=Val(.Aggregate(flexSTSum,2,16,X-1,16))
'Hj3=CurrencyToStr(Hj2)
Fori=2ToX-2
Hj1=Hj1+Val(.TextMatrix(i,15))
IfVal(.TextMatrix(i,16))>0Then
Hj2=Hj2+Val(.TextMatrix(i,15))*Val(.TextMatrix(i,16))
EndIf
Nexti
IfHj2<=A1OrHj2>=A2Then
GoToErrTransact
EndIf
Hj3=CurrencyToStr(Hj2)
.TextMatrix(X,2)=Hj1
.Cell(flexcpText,X,3,X,15)=IIf(Hj3="","",Hj3)
.Cell(flexcpText,X,16,X,17)=Format(Hj2,"¥0.00")
.Cell(flexcpAlignment,X,2,X,14)=flexAlignLeftCenter
'.SelectX,3
'.CellAlignment=flexAlignLeftCenter
IfSelRow>1AndSelCol>0Then.SelectSelRow,SelCol
EndWith
ExitSub
ErrTransact:
MsgBox"你输入的数字过大无法计算!请修改!!!"
EndSub
------------------------------------------------
将数字转换为大写金额的函数:
FunctionCurrencyToStr(ByValNumberAsCurrency)AsString
Number=Val(Trim(Number))
IfNumber=0ThenCurrencyToStr="":ExitFunction
Dimstr1AryAsVariant,str2AryAsVariant
str1Ary=Split("零壹贰叁肆伍陆柒捌玖")
str2Ary=Split("分角元拾佰仟万拾佰仟亿拾佰仟万拾佰")
DimaAsLong,bAsLong'循环基数
Dimtmp1AsString'临时转换
Dimtmp2AsString'临时转换结果
DimPointAsLong'小数点位置
IfNumber<=-922337203685477#OrNumber>=922337203685477#Then
ExitFunction
EndIf
tmp1=Round(Number,2)
tmp1=Replace(tmp1,"-","")'先去掉“-”号
Point=InStr(tmp1,".")'取得小数点位置
IfPoint=0Then'如果有小数点,最大佰万亿
b=Len(tmp1)+2'加2位小数
Else
b=Len(Left(tmp1,Point+1))'包括点加2位小数
EndIf
''先将所有数字替换为中文
Fora=9To0Step-1
tmp1=Replace(Replace(tmp1,a,str1Ary(a)),".","")
Next
Fora=1Tob
b=b-1
IfMid(tmp1,a,1)<>""Then
Ifb>UBound(str2Ary)ThenExitFor
tmp2=tmp2&Mid(tmp1,a,1)&str2Ary(b)
EndIf
Next
Iftmp2=""ThenCurrencyToStr="":ExitFunction
''〓下面为非正式财务算法,可以去掉〓
Fora=1ToLen(tmp2)
tmp2=Replace(tmp2,"零亿","亿零")
tmp2=Replace(tmp2,"零万","万零")
tmp2=Replace(tmp2,"零仟","零")
tmp2=Replace(tmp2,"零佰","零")
tmp2=Replace(tmp2,"零拾","零")
tmp2=Replace(tmp2,"零元","元")
tmp2=Replace(tmp2,"零零","零")
tmp2=Replace(tmp2,"亿万","亿")
Next
''〓上面为非正式财务算法,可以去掉〓
IfPoint=1Thentmp2="零元"+tmp2
IfNumber<0Thentmp2="负"+tmp2
IfPoint=0Thentmp2=tmp2+"整"
CurrencyToStr=tmp2
EndFunction
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Cell属性的使用:
Cell的作用是给以选定区块的特定的设置值,具体值可参阅相应属性值。
语法:Cell(条件准则,Row1,Col1,Row2,Col2)=相应准则值
其中的“条件准则”有以下准则常数,根据准则的不同而设置相应准则的值:
flexcpAlignment对齐方式
flexcpBackColor背景色
flexcpChecked选择框
flexcpCustomFormat格式设置
flexcpData日期
flexcpFloodColor颜色
flexcpFloodPercent背景色
flexcpFont字体
flexcpFontBold粗体
flexcpFontItalic斜体
flexcpFontName字体名
flexcpFontSize字体大小
flexcpFontStrikethru删除线
flexcpFontUnderline下划线
flexcpFontWidth字符宽
flexcpForeColor字符色
flexcpHeight高
flexcpLeft左
flexcpPicture添加图
flexcpPictureAlignment图对齐
flexcpRefresh刷新
flexcpSort分类
flexcpText字符
flexcpTextDisplay显示字符
flexcpTextStyle文本样式
flexcpTop返回顶端高,同RowPos和valueMatrix属性
flexcpvalue返回字符值
flexcpVariantvalue返回字符值
flexcpWidth返回单元宽
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
flexSTSum方法:每行增加小计行[这个方法还不会用]语法:
VSG.flexSTSum常数名,
[GroupOnAsLong],:标签列
[TotalOnAsLong],:计算列
[FormatAsString],:格式,例"$0.00"
[BackColorAsColor],:Color
[ForeColorAsColor],:Color
[FontBoldAsBoolean],:False|True
[CaptionAsString],:例"数%s"
[MatchFromAsInteger],:0|1|2|3
[TatalOnlyAsBoolean]:False|True
常数名:
常数常数值说明
flexSTNone0大纲唯一的,没有合计价值
flexSTClear1清除全部的小计
flexSTSum2总数
flexSTPercent3总数的百分比
flexSTCount4行数
flexSTAverage5平均
flexSTMax6最大的
flexSTMin7最小的
flexSTStd8标准偏差
flexSTVar9方差
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
MousePointer、MouseIcon鼠标指针的应用:
0=flexDefault
1=flexArrow
2=flexCross
3=flexIBeam
4=flexIcon
5=flexSize
6=flexSizeNESW
7=flexSizeNS
8=flexSizeNWSE
9=flexSizeEW
10=flexUpArrow
11=flexHourglass
12=flexNoDrop
13=flexArrowHourGlass
14=flexArrowQuestion
15=flexSizeAll
50=flexPointerCopy'(&H32)'拖动带拷贝
51=flexPointerMove'(&H33)'拖动
52=flexSizeHorz'(&H34)'左右调整
53=flexSizeVert'(&H35)'上下调整
54=flexHand'(&H36)手型
99=flexCustom'自定义
ConstMA="50,51,52,53,54"
DimxyAsInteger
xy=Val(Text1.Text)
Ifxy>15Andxy<>99AndInStr(MA,xy)=0Thenxy=15
VSG1.MousePointer=xy
Ifxy=99Then
VSG1.MouseIcon=LoadPicture("C:/icon/Icon.ico")
EndIf
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
单击列头将列互相拖动调换:
方法一:
VSG1.ExplorerBar=flexExMove'2这是最简单的方法了
注意这个属性在VB属性表中只设置了0、1、2、3、5、7、8种常数值
ExplorerBar属性(value=0|1|2|3|5|7|8):
0-flexExNone:默认,单击列头选择整列,单击行头选择整行
1-flexExSort:单击列头可正反排序该列,单击行头选择整行
2-flexExMove:单击列头可交换列顺序,单击行头选择整行
3-flexExSortAndMove:具有1和2的功能
4:单击列头可正反排序该列并在列头显示相应箭头,单击行头选择整行
5-flexExSortShow:好像与4相同也
6:具有2和4的功能
7-flexExSortShowAndMove:好像与6相同也
8-flexExMoveRows:单击列头选择整列,可拖动行
9:单击列头可正反排序该列,可拖动行
10:可拖动行与列
11:可排序列及拖动行列
12:可排序列并在列头显示相应箭头,还可拖动行
13:同12。
14:除12功能外,可拖动列
15:同14。
方法二:
PrivateSubVSG1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
Dimr%,c%
r=VSG1.MouseRow
c=VSG1.MouseCol
Ifr=0Andc>0Then
VSG1.Tag=c
VSG1.Cell(flexcpBackColor,0,c)=vbYellow
VSG1.MousePointer=flexPointerMove
EndIf
EndSub
PrivateSubVSG1_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
IfLen(VSG1.Tag)Then
Dimr%,c%,p%
r=VSG1.MouseRow
c=VSG1.MouseCol
Ifr=0Andc>0Thenp=flexPointerMove
IfVSG1.MousePointer<>pThenVSG1.MousePointer=p
EndIf
EndSub
PrivateSubVSG1_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
IfLen(VSG1.Tag)Then
Dimr%,c%,target%
target=VSG1.Tag
VSG1.Cell(flexcpBackColor,0,target)=0
VSG1.Tag=""
VSG1.MousePointer=0
r=VSG1.MouseRow
c=VSG1.MouseCol
Ifr=0Andc>0Andc<>targetThen
VSG1.ColPosition(target)=c
EndIf
EndIf
EndSub
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
VSFlexString控件属性一览表
CaseSensitive???
Error失败时取得错误信息
Index索引
MatchCount取得与检索条件相一致的字符串数量
MatchIndex设定与检索条件相一致的字符串的索引
MatchLength取得与检索条件相一致的字符串长度
MatchStart取得与检索条件相一致的字符串起始位置
MatchString取得与检索条件相一致的字符串
Name
Object
Parent
Pattern设定检索条件
Replace设定置换字符串
Soundex取得代表当前检索字符的声音代码
Tag
TagCount取得与检索条件相一致的标签数量
TagIndex在多个标签情况下,设定/取得与检索条件相一致的标签索引
TagLength取得与检索条件相一致的标签长度
TagStart取得与检索条件相一致的标签起始位置
TagString取得与检索条件相一致的标签的字符串
Text设定成为检索对象
Version取得FlexString的版本号
--------------------------------------------------------

MSFlexGrid与VSFlexGrid的单元格合并例子:


PrivateSubForm_Load()
DimiAsLong
Withfg
.WordWrap=True
.Rows=6
.Cols=6
.FixedRows=2
.FixedCols=0
.ColWidth(0)=1500
.RowHeight(0)=300
.RowHeight(1)=300
.TextMatrix(1,1)="进货"
.TextMatrix(1,2)="销售"
.TextMatrix(1,3)="退货"
.TextMatrix(1,4)="结存"

Fori=1To.Rows-1
.RowHeight(i)=300'设置行高
Nexti
Fori=0To1
.TextMatrix(i,0)="上月"&vbCrLf&"结存数量"'//换行
.FixedAlignment(0)=4
Nexti
Fori=0To1
.TextMatrix(i,5)="月末结存"
.FixedAlignment(5)=4
Nexti
Fori=1To4
.TextMatrix(0,i)="本月进销存数量"
.ColAlignment(i)=4
Nexti

.MergeCells=flexMergeFree
'.MergeCells=flexMergeFixedOnly
.MergeCol(0)=True
.MergeRow(0)=True
.MergeCol(5)=True
EndWith
EndSub

请问:如何使用VSFlexGridPro分级显示和存取数据库中的数据。类似于《让TreeView支持无限级分类》帖子中所介绍的使用树形控件显示和存取数据库的数据。


DimcnasNewADODB.Recordset
DimrsAsNewADODB.Recordset
DimlngYAsLong
DimintTAsInteger
cn.open"............"
rs.Open"select系统编号fromtestorderby系统编号",cn
WithVSFlexGrid1
Set.DataSource=rs
.RowOutlineLevel(1)=1
.IsSubtotal(1)=True

ForlngY=1To.Rows-1
intT=Len(.TextMatrix(lngY,0))-Len(Replace(.TextMatrix(lngY,0),".",""))
.RowOutlineLevel(lngY)=intT
.IsSubtotal(lngY)=True
Next
.OutlineCol=0
.OutlineBar=flexOutlineBarSimpleLeaf

EndWith





SetVSFlexGrid1.DataSource=Rs'这一步一定要有,
WithVSFlexGrid1
.DataRefresh

.Sort=flexSortGenericDescending'排序

EndWith
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics