|
本帖最后由 wpxxsyzx 于 2014-10-5 15:12 编辑
熟悉vs2010的控件中,发现listview控件配合imagelist控件只能在第一列显示图片,不能像vb里可以在其他列(subitem)显示图片。csdn网友回答可以用DrawSubItem事件重绘控件实现,查找帮助没有有价值的参考,百度出来的竟然全是c#代码,msdn看的一头雾水,n次试验后终于可以了,却发现一旦重绘,添加好的表头和其他项全清空了,查看DrawListViewSubItemEventArgs的每个属性,发现DrawDefault属性,狂喜,测试,成功。NND,真费事。
重绘控件还有很多东西,源文件只是一个简单的例子。
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
With ListView1
.View = View.Details
.FullRowSelect = True
下句开启控件重绘,否则下面的Sub ListView1_DrawSubItem过程不起作用
详细内容可查看OwnerDraw的帮助
.OwnerDraw = True
.Items.Clear()
.Columns.Add("A").Width = 200
.Columns.Add("B").Width = 18
.Columns.Add("C").Width = 18
With .Items.Add("第一个")
.SubItems.Add("")
.SubItems.Add("")
End With
With .Items.Add("第二个")
.SubItems.Add("")
.SubItems.Add("")
End With
End With
End Sub
Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
下句重要,是将控件控制权交换给系统,否则一旦重绘,添加好的表头和其他项全清空,你需要逐一绘制各个项目
你可以注释此句看看效果。详细内容可查看DrawDefault的帮助
e.DrawDefault = True
End Sub
Private Sub ListView1_DrawSubItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewSubItemEventArgs) Handles ListView1.DrawSubItem
If e.ColumnIndex = 0 Then
e.DrawDefault = True
ElseIf e.ColumnIndex = 1 Then
下面就是用 Graphics方法重绘控件的第二、三项,加入图片。(这里简单按指定大小重绘)
DrawImage方法有很多重载,可以实现不同的绘制图片的效果
Graphics方法还可以重绘文字,颜色等 。 详细内容可查看Graphics和DrawImage的帮助
e.Graphics.DrawImage(ImageList1.Images(1), e.Bounds)
ElseIf e.ColumnIndex = 2 Then
e.Graphics.DrawImage(ImageList1.Images(0), e.Bounds)
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
With ListView1.Items.Add("第三个")
.SubItems.Add("")
.SubItems.Add("")
End With
End Sub
End Class
|
|