自行编码绘制单元格
为了便于学习本节的内容,可以先打开CaseStudy目录下的文件“ListView.Table”,并参考该文件名为“示例二十四”的窗口。
ListView有个DrawViewCell事件,在绘制某个单元格的时候触发,其e参数成员有:
Sender:
触发Form的控件
Form: 触发事件的窗口
Row: 正在绘制的行
Col: 正在绘制的列
X: 要绘制单元格的水平坐标位置,单位为像素
Y: 要绘制单元格的垂直坐标位置,单位为像素
Width: 要绘制单元格的宽度,单位为像素
Height: 要绘制单元格的高度,单位为像素
Graphics: 返回一个Graphics对象,通过这个对象可以在单元格中绘制图形
DrawDefault:
逻辑属性,是否取消系统默认的绘制单元格动作,此属性默认为True,必须设置为False才能编码绘制单元格。
DrawText: 这是一个方法,执行此方法将用默认的方式绘制单元格的文本内容。
DrawBackground: 这是一个方法,执行此方法将用默认的当时绘制单元格背景。
提示:
1、必须将ListView的OwnerDraw属性设置为True,才能触发DrawViewCell事件。
2、必须将显示模式为Details(详细信息),否则OwnerDraw属性设置为True后,ListView不会显示任何项目。
示例:
假定用ListView显示一个进度表中的数据,在进度单元格希望用图形来表示进度:
设计步骤:
1、首先设置生成按钮的代码,注意加粗的两行代码
Dim
lvw As
WinForm.ListView
= e.Form.Controls("ListView1")
lvw.StopRedraw()
'暂停绘制
lvw.Columns.Clear()
'清除原来的列
lvw.Rows.Clear()
'清除原来的行
lvw.Images.Clear()
'清除原来的图片
lvw.View
= ViewMode.Details
'显示模式为详细信息时才能编码绘制单元格
lvw.OwnerDraw
= True '必须将OwnerDraw事件设置为True,才会触发DrawViewCell事件
lvw.GridLines
= True '显示网格线
Dim
cls()
As
String
=
{"项目","负责人","进度"}
'指定要显示的各列
Dim
wds()
As
Integer
=
{100,100,300}
'定义列宽
For
i
As
Integer
=
0
To
cls.Length
-
1
Dim
c
As
WinForm.ListViewColumn
=
lvw.Columns.Add()
c.Name
=
cls(i)
'指定列名
c.Text
=
cls(i)'指定列标题
c.Width
=
wds(i)
'指定列宽
Next
For
Each
dr
As
DataRow
In
DataTables("进度").DataRows
'从数据表中提取数据
Dim r
As WinForm.ListViewRow
= lvw.Rows.Add()
'增加一行
For Each
cl As
String In
cls '逐列取值
r(cl)
= dr(cl)
Next
Next
lvw.ResumeRedraw()
'恢复绘制
2、然后设置DrawViewCell事件的代码:
If
e.Col.name
= "进度" Then
e.DrawDefault
= False '取消默认的绘制
Dim Width
As Integer
= (e.Width -
2 ) * e.Row("进度")
\ 100
If e.Row("进度")
= 100 Then
e.Graphics.FillRectangle(Brushes.Green,e.x
+ 1,e.y
+ 1, Width,
e.Height -
2)
Else
e.Graphics.FillRectangle(Brushes.Red,e.x
+ 1,e.y
+ 1, Width,
e.Height -
2)
End If
e.DrawText()
End
If