winform ListView应用之分组、重绘图标、网格线 (c# .net winform)

这篇博客介绍了如何在C# .NET Winform中扩展ListView,实现分组、为ListViewSubItem设置图标、绘制网格线、处理选中背景以及呈现原始文本等功能。通过重写OnDrawSubItem方法和设置相关属性,实现了自定义的ListView增强效果。
摘要由CSDN通过智能技术生成

最近在winform应用中需要用到可分组的数据列表功能,DataGridView默认没有提供分组的功能,而OutlookGrid(http://www.codeproject.com/KB/grid/OutlookGrid.aspx)用起来又是相当的麻烦,最后发现了ObjectListView(objectlistview.sourceforge.net),功能相当的强大,强大到我不需要那么多的功能,额~~所以决定参照它的实现,对ListView做一个简单的扩展(注:本文仅针对ListView的View属性为Details)。

 

首先为ListView添加好列: 

listViewEx1.Columns.AddRange( new  ColumnHeader[] { new ColumnHeader("列1"), new ColumnHeader("列2"), new ColumnHeader("列3") });

 

分组

这是ListView自带的功能,用起来也很简单,只需要把ShowGroups设置为true(默认为true),再为ListView添加ListViewGroup,并为ListViewItem设置Group即可,代码如下:

ListViewGroup g = new  ListViewGroup("分组");
listViewEx1.Groups.Add(g);
ListViewItem item = new  ListViewItem("数据项", g);
listViewEx1.Items.Add(item);

接下来的重绘方法,就需要通过继承ListView并重写OnDrawSubItem(DrawListViewSubItemEventArgs e)方法来实现,在重写此方法之前,必须设置ListView的OwnerDraw属性为true,用于启用重绘。

 

给ListViewSubItem设置图标

ListView默认可以设置ImageIndex来显示图标,但是只能设置在每个ListViewItem上,即每一行数据只能有一个图标,若要每个ListViewSubItem都能设置图标,则需要通过重写OnDrawSubItem(DrawListViewSubItemEventArgs e)方法来实现,关键代码为:

Graphics g = e.Graphics;
Rectangle r = e.Bounds;
Rectangle imageBounds = new  Rectangle(r.Location, image.Size);//image为具体的图标文件
g.DrawImage(image, imageBounds); //通过DrawImage方法绘制图标

对这种方法简单的改造,可以为每一列设置单独的图标。

 

网格线

ListView在设置了分组的情况下,GridLines属性就无效了,所以如果需要显示网格线,也需要通过重写OnDrawSubItem(DrawListViewSubItemEventArgs e)方法来实现,关键代码为:

Graphics g = e.Graphics;
Rectangle r = e.Bounds;
using  (Pen pen = new Pen(Color.Gray))
{
     g.DrawRectangle(pen, r.X, r.Y, r.Width, r.Height + 1); //高度加1使横向线条重叠
}

以上代码画了灰色的网格线,也可以简单改造以实现自定义的网络线颜色。

 

选中的背景

在重写OnDrawSubItem(DrawListViewSubItemEventArgs e)方法之后,选中ListView的行,默认的背景色不会出现,所以还得把选中状态的背景色显示出来,关键代码为:

     if  ((e.ItemState & ListViewItemStates.Selected)
== ListViewItemStates.Selected)
     {
         using  (SolidBrush brush = new SolidBrush(Color.Blue))
         {
             g.FillRectangle(brush, r);
         }
     }

以上代码为选中的列绘制了蓝色的背景,同样也可以扩展以上代码来实现自定义背景色。

 

呈现原始文本

在重写OnDrawSubItem(DrawListViewSubItemEventArgs e)之后,原来的文本内容同样也会像背景一样丢失了,所以需要把原来的文本重新绘制出来,关键代码如下:

Graphics g = e.Graphics;
Rectangle r = e.Bounds;
TextRenderer.DrawText(
     g,
     e.SubItem.Text,
     e.SubItem.Font,
     r,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值