VB表格控件总览与例程分析[转载]

上一篇 / 下一篇  2007-03-06 09:37:31 / 天气: 晴朗 / 心情: 平静 / 个人分类:vb

 

{Y2n|[1BG }0一.表格控件总览:51Testing软件测试网 _'MD}~9s
51Testing软件测试网r4f}:s%Z&R
  在VB开发环境中,表格控件在界面开发元素中占有重要的地位。它不仅有外观整洁、表达形式规范的优点,而且更重要的是它较高的信息表现率(就是相对于其他控件来说能够表达更多的信息),随着信息时代的到来,它的应用将更加的广泛。

V^,VQb"p0   那么在VB平台下,如何操作这一功能强大的控件元素呢?事实上我们知道,VB平台下面的表格控件是相当丰富的,总结下来提供了4种类型:Microsoft Data Bound grid Control、Microsoft Datagrid Control、Microsoft Flexgrid Control、Microsoft Hierarchial Flexgrid Control.
4U-ELkvK+s&@0这四种表格各有其特点,下面我们一一讨论。51Testing软件测试网+W1f5LSKh.I Y5VE8D

*AZ"u(~'rzt H0  1. Microsoft Data Bound grid Control
Yu:WZ| ikz1UF3H051Testing软件测试网&_*{9MpE
  此控件主要用于数据绑定(可以不绑定,但是因为不提供对单个cell的控制支持,所以实际上这样做是不经济的)。具体说来,就是数据源比较固定的情况下可以使用这种控件。
WNV%T*Xn7w+j*A0
3H N5qC,`;u0  具体使用方法是设定此控件的datasource属性,就可以不用编写任何代码就可以显示该数据源所指向的记录数据。比如可以将datasource设置为一个data控件,而data控件又指向数据库"成绩"的 一个"语文"表,那么当程序运行时,它就自动显示此"语文"表的数据。
;M7c6|6? ]G0
c(Bc/H`8P9A7L/I0  从上面的分析看得出来,这个控件虽然操作方便,但是它也有局限性,就是不能对显示的数据进行灵活的控制操作,比如有些数据允许用户修改,有些数据却不允许用户修改,而此控件却只能提供全部数据源的原子操作:即要么全部允许修改,要么就全部不允许。还有另外此控件也不提供对单个单元格(cell)进行操作,所以提供不了更为个性化的界面风格。
}5V"c^ E051Testing软件测试网KJ&V8X7G5o#d
  2. Microsoft Datagrid Control51Testing软件测试网2mv.XH u AU?:^

"]{7}4d~2y;_OE0  此控件跟前面介绍的Data Bound grid Control控件很相似,也是主要进行绑定操作,而缺点和Data Bound grid Control完全一样。但是它跟Data Bound grid Control不一样的是其数据源的驱动引擎只能是OLEDB形式的,不能是DAO,比如就可以使用ADO数据控件,不能使用DATA控件。而Data Bound grid Control却刚好和它相反,这一点在开发中一定要注意。
L7T/m^? `8s9@p0
6Sa ]cM4a0  3. Microsoft Flexgrid Control与Microsoft Hierarchial Flexgrid Control.
3Y.AG7lK%v j&QH*H0
:q2Cfwv3W)SCS6u0  这里重点介绍这两种控件,因为在实际开发中,这两种控件应用的场合更多一些,它不仅能够反映数据,而且也能把数据的修改信息反映到数据库中去,所以弥补了上述两种控件的不足。51Testing软件测试网/l7b C?*^,o7_3} J
51Testing软件测试网:wm)G7rz!t
  如果数据不需要修改,那么可以进行绑定操作,其方法跟前面介绍的完全一样,就是通过设置DataSource属性来完成数据的显示工作。但是实际开发中,需要对整个表格控件更为灵活的显示控制。51Testing软件测试网)\7xW:p xM9Y#o3H
51Testing软件测试网*G_{6_hd
  在给出例程之前,有必要对这一控件进行比较详尽的认识:这种控件允许将文本或者图象放置于每个单元格之中,控件的Row与Col属性允许用户在代码中指定当前行和列,当然也可通过操作鼠标和键盘来改变这两个属性,而text属性指明当前单元格的文本。如果单元格的文本太长而不能完全显示出来的话,可以通过将WordWrap属性设置为true来达到显示的目的。下面将比较重要的属性小结如下:
KZ w.qi#E j6N0
M1Ke {;ndq]L0  DataSource---------用来指定需要绑定的数据源,比如data控件。51Testing软件测试网0^:[gInx%YE^E.Q

p/_%Q }f"A-T6B0  Cellpicture----------用来设定当前单元格的图象,便于显示该图象。此属性不能在设计时使用。
MK5j7C;o;k:U-r7SX0
!n6DKMJ(H$Q7aO0  Col,Row---------------设定当前列和当前行,注意它们均是从0开始的,如果同时设定它们,可以指定当前的单元格。设计时也不能使用。
;Jn,d6s8b5Et0
WS B9yU(h&A0  Cols,Rows---------------设置表格控件总的列数和行数。51Testing软件测试网K].XyB6v#V1X
51Testing软件测试网+a^/D6M$Tn3} F(Z+TG
  Hwnd---------------表格句柄,可以结合Windows API对表格控件进行更高级的控制。
#hr5D2aG:v8I4j0
4~Z`Ux/p0@E0  Text---------------指定当前的单元格的文本内容。
.h;T}6pM^'zN wf?0
n+qR]}-N0  TextMatrix(i,j)-------此属性比较重要,它用来指定第I行和第j列所确定的单元格的文本内容。它等价于下面的代码:
$EY'I t)hV|yY'B0
wl yb&e\0MSHFlexGrid1.Rows =i
6v/M,WD Xk W7Y X0MSHFlexGrid1.Cols =j
$B8Oy+P]*S1ey0MSHFlexGrid1.Text =指定的字符串
:P0AsC)S!W?051Testing软件测试网9t5M"Qx1~yD m$w
  WordWrap-------为ture时可以在当前单元格换行显示,否则如果要显示的字符的长度超过列宽,那么就不能显示完全。51Testing软件测试网:X l$C| l3Z6?
二.例程分析:
C5D)c? `?1]fG/s051Testing软件测试网Tg(qk6|\`&?
  以上只是介绍了表格控件经常使用的属性,还有很多其他重要的属性这里限于篇幅就不一样讲解了,如果读者有兴趣的话可以参考MSDN上相关的内容的介绍,下面我这里提供一个例程来巩固前面的知识内容。51Testing软件测试网c @\c JQ_
例程是使用Flexgrid 控件(由于Data Bound grid和Datagrid比较简单,所以这里就不再介绍了),如果大家手头上用的是MSHFlexgrid控件的话,只需要把名称换为MSFlexGrid1即可。该例程主要实现后台数据库的显示工作,其界面如下:

51Testing软件测试网p9`%r|[ io.?v

51Testing软件测试网l J}jpL$U'zh,r


c,Nq;K a9V0x051Testing软件测试网ez,z.x~ X
  主要代码如下:
}Y"W vRr }#M0

.p3{]O}w&mg0Dim lastrow% '最后一次鼠标点击的行51Testing软件测试网%d"y:CD^9J%E._'X
Dim lastcol% '最后一次鼠标点击的列51Testing软件测试网 FlcQ)p
Private Sub Command1_Click()51Testing软件测试网q!w5KD,UN-Z
MsgBox Data1.Database.Recordsets.Count51Testing软件测试网|t6A:^+j |y#wC6N
End Sub51Testing软件测试网*f,L*Fv1UW!L
Private Sub Form_Load()51Testing软件测试网'jJ vlau}Q
'初始化数据
}Ei;LS)c#y4z0click = False51Testing软件测试网W@7Yub7k-KV,k
lastrow = 151Testing软件测试网\1RK1z%RX
lastcol = 151Testing软件测试网*{fv|)xR
'初始化data控件,进行绑定显示的初始化
p)tNS1}|,EF{0Data1.DatabaseName = App.Path & "\db1.mdb"
+h'L_ ] _ O edf0Data1.RecordSource = "成绩表"
-sQ:u7m:B*d7}s'o h0'进行非绑定显示51Testing软件测试网B5O| Fwc\,B/p
Data1.Refresh51Testing软件测试网fL d/s/W
Data1.Recordset.MoveFirst51Testing软件测试网/_;\I?c5uA5t
MSFlexGrid2.Rows = Data1.Database.Recordsets.Count + 1 '设置总行数
n;xgB+D h(vl0MSFlexGrid2.Cols = Data1.Recordset.Fields.Count + 1 '设置总列数
$Y \[fX4Dn0MSFlexGrid2.GridColor = vbBlue '网格颜色
:@:X`i9j.n+Q7g-GU0MSFlexGrid2.ForeColor = vbRed '字体颜色
HE'H2_#V[C0MSFlexGrid2.GridLines = 1 '设置网格线的属性
*Z/W3D`$E ^'b V0MSFlexGrid2.GridLineWidth = 2 '设置网格线的粗细程序,默认为1
l9r AL:rX&w0MSFlexGrid2.ToolTipText = "非绑定显示" '设置工具提示文本51Testing软件测试网Rz"F~Z0H8x5h7T
MSFlexGrid2.BackColorSel = vbGreen '单元格被选中的颜色
$[y'Y/Z9~0Dim i%
au(Z,[2F"T$M0Dim j%51Testing软件测试网3Yf0rtIZ ?
'设置列头文本
-Mgr+K h ]0For i = 1 To MSFlexGrid2.Cols - 151Testing软件测试网lhgc JjD m;X
MSFlexGrid2.TextMatrix(0, i) = Data1.Recordset.Fields(i - 1).Name
9Kb"?&w(F#R`)^m,X1IB0Next i
cAY1cQt,U{G9g0'设置数据
oDP4IP3V)|z|0For i = 1 To MSFlexGrid2.Rows - 1 '控制行51Testing软件测试网%a\X?v?
For j = 1 To MSFlexGrid2.Cols - 1 '控制列
B!Jm1LM)L;WCY^0MSFlexGrid2.TextMatrix(i, j) = Data1.Recordset.Fields(j - 1).Value51Testing软件测试网4WrhrrbB
Next j51Testing软件测试网"pJ7V4KI\2b9X
Data1.Recordset.MoveNext
5g5nv\:qz+| _!N(ej0Next i
(kY)by(y7DrA0'设置当前单元格的图象信息
H yG WC0MSFlexGrid2.Col = 051Testing软件测试网Q%SgQ)t(Q)V'W
MSFlexGrid2.Row = 2
Ch/p F8|kK,Z a-^0Set MSFlexGrid2.CellPicture = LoadPicture(App.Path & "\cell.bmp")
Y?9ha"a{ UQ2c7G0End Sub
0U3}5^@}:\.C|&[0'实现鼠标点击一个单元格的背景颜色的改变功能
MNa7O8C4e?0Private Sub MSFlexGrid2_Click()51Testing软件测试网b P"Eyl
MSFlexGrid2.Row = lastrow51Testing软件测试网8l)?*l*np"L
MSFlexGrid2.Col = lastcol51Testing软件测试网l3t~$^!LB[t.]0f6Ld
MSFlexGrid2.CellBackColor = vbWhite
KM+v`(h,lVj:R8A0MSFlexGrid2.Row = MSFlexGrid2.MouseRow
N GaIA7N0MSFlexGrid2.Col = MSFlexGrid2.MouseCol
A3qnxG0MSFlexGrid2.CellBackColor = vbCyan
Xm W+}J0lastrow = MSFlexGrid2.Row
^ V?$e-yQ&U[c0lastcol = MSFlexGrid2.Col51Testing软件测试网2p6B*{.Np$Tu H
End Sub

RJH3dEE.\0  要在不绑定数据的情况下实现编辑修改的功能,如果对控件不进行改进是无法达到目的的。这里实现的思路是首先判断光标(或者说焦点)在哪个单元格上,然后在在单元格的范围内动态创建一个文本框(不过在vb平台下,可以考虑先在设计时放置一个不可见的文本框,然后通过move方法将其放置到当前单元格并且显示它即可达到相同的目的),其大小正好可以把此单元格给覆盖掉,然后就可以把原来的文本信息附给该文本框,这样就可以直接在文本框内进行编辑修改操作,从而实现了单元格的编辑修改功能,依据这个思想来可以在单元格里面创建下拉列表框,复选框等控件。其实现的核心代码如下:
gb1[9k@$Y,l~051Testing软件测试网4W#dbo!L

'实现编辑功能51Testing软件测试网,]-HL*_%\_T
Private Sub MSFlexGrid3_DblClick()
m8Iq7G(A:q(^0Text1.Visible = False
/fI6W g*x}3g]0'如果初次双击,那么就执行如下代码
3Xk C pL;D"t!I+c0If firstclick = True Then
|re)S9G]JZ0lastclickrow = MSFlexGrid3.Row51Testing软件测试网vvj%d!x"X8RF8J
lastclickcol = MSFlexGrid3.Col51Testing软件测试网~"AG(j4|e }3e|;p
Text1.Text = MSFlexGrid3.TextMatrix(lastclickrow, lastclickcol)51Testing软件测试网7{5K8q5tdQ
End If
a!l-]-i7b$nnH1Z5f0'将文本框放置到当前单元格处
4as"s1?;e+n5j*Yo!c,_0Dim LeftOfText% '文本框的left属性51Testing软件测试网8as1@'q#`3`2N
Dim TopOfText% '文本框的top属性51Testing软件测试网y kR0n1e?
Dim selrow% '当前行
H@]ZX-t0Dim selcol% '当前列
&U)O;Y)TJ6sE @K0selrow = MSFlexGrid3.Row
,`&_ CfY8gIK0selcol = MSFlexGrid3.Col51Testing软件测试网H'] R bAg1M
LeftOfText = Frame3.Left + MSFlexGrid3.Left + MSFlexGrid3.ColPos(selcol) + 45
y Y^1L6NC0TopOfText = Frame3.Top + MSFlexGrid3.Top + MSFlexGrid3.RowPos(selrow) + 4551Testing软件测试网WS2c+[Z
Text1.Move LeftOfText, TopOfText, 930, 20051Testing软件测试网6sSx[/Bj2c
Text1.Visible = True51Testing软件测试网+t2`#o L;s$D_ N;@ q!hG
'如果不是初次双击,那么就执行如下代码51Testing软件测试网9O)p8_~\ w L@
If firstclick = False Then51Testing软件测试网"}r1U2~z+Rq E
MSFlexGrid3.TextMatrix(lastclickrow, lastclickcol) = Text1.Text
JOP,w,@6z X4ot0lastclickrow = MSFlexGrid3.Row51Testing软件测试网U"E|BvQMV
lastclickcol = MSFlexGrid3.Col51Testing软件测试网,@+`"Vn2XJ
End If51Testing软件测试网W2L8A6lS&K9D*j!Q
Text1.Text = MSFlexGrid3.TextMatrix(selrow, selcol)51Testing软件测试网O@AI'Ev
'已经不是第一次进行双击操作51Testing软件测试网7{mA [8D;@1qZ
firstclick = False
!d5Li a FJDP0End Sub
51Testing软件测试网4t:R7p0j _)}

  三.小结:
N`D7RCb+A;Sx0
51Testing软件测试网)F*IbjdQOx,jC
  数据表格控件在实际运用用还有很多技巧,只有不断的在实际编程中积累经验才能达到灵活运用的功效

']WksQ E,E0

TAG: vb

 

评分:0

我来说两句

Open Toolbar