自行编码绘制单元格

为了便于学习本节的内容,可以先打开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.ListViewRowlvw.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


本页地址:http://www.foxtable.com/webhelp/topics/2873.htm