ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7905|回复: 11

[分享] 【学习VSTO】——vs2010 重绘listview控件 附源代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-11-21 14:55 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 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

WindowsApplication1.rar

74.23 KB, 下载次数: 172

TA的精华主题

TA的得分主题

发表于 2012-11-21 14:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
你去CSDN问也许会快些

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-21 15:02 | 显示全部楼层
liucqa 发表于 2012-11-21 14:58
你去CSDN问也许会快些

谢谢,正在等待回答

TA的精华主题

TA的得分主题

发表于 2012-11-21 20:38 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-21 21:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wqfzqgk 发表于 2012-11-21 20:38
j是不是这个意思

是用的DrawSubItem吗?有没有其他方法不用重绘,像vb里直接使用

TA的精华主题

TA的得分主题

发表于 2012-11-21 22:02 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-21 22:13 | 显示全部楼层
看图,你不是添加了吗?重绘listview控件可以为subitem添加图片,太麻烦,也影响速度

TA的精华主题

TA的得分主题

发表于 2012-11-21 23:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-11-21 23:21 | 显示全部楼层
估计你是想做kutool中的那个批注形状吧

点评

哦,只是熟悉vs控件的功能  发表于 2012-11-22 22:52

TA的精华主题

TA的得分主题

发表于 2012-11-22 13:24 | 显示全部楼层
本帖最后由 bikaqiou2000 于 2012-11-22 13:26 编辑

.net用DataGridView+DataGridViewImageColumn方便些吧...
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-22 23:50 , Processed in 0.041847 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表