本文记录下windows中最常用的ListView控件的使用:
列表视图通常是为了显示数据,以行或者列的形式显示内容。它可以有几种不同的模式显示,如Details模式,Tile模式。如下图所示:
ListView具有以下几种模式:
1、LargeIcon:每个项都显示为一个最大化图标,在它的下面有一个标签。
2、SmallIcon:每个项都显示为一个小图标,在它的右边带一个标签。
3、List:每个项都显示为一个小图标,在它的右边带一个标签。各项排列在列中,没有列标头。
4、Details:可以显示任意的列,但只有第一列可以包含一个小图标和标签,其它的列项只能显示文字信息,有列表头。
5、Tile:每个项都显示为一个完整大小的图标,在它的右边带项标签和子项信息。
大家可以在我的电脑中切换模式看下区别,下文也会展示出来。
列表视图中的选项总是ListViewItem类的一个实例,它包含了要显示的信息,如文本和图标的索引。ListViewItems对象有一个SubItems属性,其中包含了另外一个类ListViewSubItem的实例。当ListView控件处于Details或Title模式下,这些子选项就会显示出来。每个子选项表示列表视图中的一列(不是一行)。子选项不能显示图标,主选项是可以显示图标的。
下面代码展示一下:
我们首先做一个简单的效果,做一个类似硬盘文件显示信息那种(如下图)。列表内容由代码添加。
先添加一个ListView控件,名字为listViewtest,然后修改代码,代码如下:
public Form1()
{
InitializeComponent();
ListViewSet();//设置显示模式
CreateViewItemMethodOne();
}
//ListView设置
private void ListViewSet()
{
//设置ListView的显示方式为details
listViewtest.View = View.Details;
}
//代码添加显示项
private void CreateViewItemMethodOne()
{
listViewtest.BeginUpdate();
//create the title
//the first method to add item property
listViewtest.Columns.Add("姓名");
listViewtest.Columns.Add("年龄");
listViewtest.Columns.Add("家庭地址");
//name1 就好像第一行的一个标记,
listViewtest.Items.Add("name1", "张3", 0);
listViewtest.Items["name1"].SubItems.Add("18");
listViewtest.Items["name1"].SubItems.Add("呵呵县哈哈镇");
listViewtest.Items.Add("name2", "李4", 0);
listViewtest.Items["name2"].SubItems.Add("19");
listViewtest.Items["name2"].SubItems.Add("哈哈县嘿嘿镇");
listViewtest.Items.Add("name3", "王5", 0);
listViewtest.Items["name3"].SubItems.Add("20");
listViewtest.Items["name3"].SubItems.Add("嘿嘿县呵呵乡");
// 声明ListViewItem 和ListViewSubItem实例,并且设置实例属性,然后添加到实例对象中
ListViewItem lvItem;
ListViewItem.ListViewSubItem lvSubItem;
lvItem = new ListViewItem();
lvItem.Text = "陈7";
//此句结束,则可以显示到桌面上上了
listViewtest.Items.Add(lvItem);
//实例化SubItem
lvSubItem = new ListViewItem.ListViewSubItem();
lvSubItem.Text = "18";
lvItem.SubItems.Add(lvSubItem);
lvSubItem = new ListViewItem.ListViewSubItem();//这里要另外new一个对象,否则后边设置的内容会覆盖到前面内容
lvSubItem.Text = "slgjlsgj";
lvItem.SubItems.Add(lvSubItem);
lvItem = new ListViewItem();
lvItem.Text = "钱10";
listViewtest.Items.Add(lvItem);
//实例化SubItem
lvSubItem = new ListViewItem.ListViewSubItem();
lvSubItem.Text = "20";
lvItem.SubItems.Add(lvSubItem);
lvSubItem = new ListViewItem.ListViewSubItem();
lvSubItem.Text = "哈哈呵呵嘻嘻";
lvItem.SubItems.Add(lvSubItem);
listViewtest.EndUpdate();
}
效果如下图:
可以看到有两种方式添加列表的内容。
下面我们一步一步分析下,创建ListView的过程,
1.创建表头
//创建列表头的两种方式
//1 创建列表头对象实例,设置实例属性,并且添加到ListView中
ColumnHeader colHeader= new ColumnHeader();
colHeader.Text = "列标题";
colHeader.Width = 120;//width
colHeader.TextAlign = HorizontalAlignment.Right;
this.listViewtest.Columns.Add(colHeader);
//2. 直接在ListView中添加头对象
this.listViewtest.Columns.Add("列标题2", 120, HorizontalAlignment.Left);
2.添加内容
listViewtest.Items.Add("name3", "王5", 0);
listViewtest.Items["name3"].SubItems.Add("20");
listViewtest.Items["name3"].SubItems.Add("嘿嘿县呵呵乡");
// 声明ListViewItem 和ListViewSubItem实例,并且设置实例属性,然后添加到实例对象中
ListViewItem lvItem;
ListViewItem.ListViewSubItem lvSubItem;
lvItem = new ListViewItem();
lvItem.Text = "陈7";
//此句结束,则可以显示到桌面上上了
listViewtest.Items.Add(lvItem);
//实例化SubItem
lvSubItem = new ListViewItem.ListViewSubItem();
lvSubItem.Text = "18";
lvItem.SubItems.Add(lvSubItem);
lvSubItem = new ListViewItem.ListViewSubItem();//这里要另外new一个对象,否则后边设置的内容会覆盖到前面内容
lvSubItem.Text = "slgjlsgj";
lvItem.SubItems.Add(lvSubItem);
smalllcon模式:
首先添加一个imagelist控件,选择添加图片(choose images),如下如所示:
然后添加图片,注意到图片旁边都会有标号,可以在代码中直接使用标号。
OK,下面修改代码
listViewtest.SmallImageList = imageList1;
lvi.ImageIndex = i; //通过与imageList绑定,显示imageList中第i项图标
这里模式仍然是Details,
看下显示效果
然后我们可以修改下模式,将模式改为smalllcon模式,
this.listViewtest.View = View.SmallIcon;
其余代码不变,看下运行效果
可以看出来,在Details模式下,才会有列标头,
整个代码如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ListViewSet();//设置显示模式
CreateViewItemMethodOne();
}
private void ListViewSet()
{
this.listViewtest.View = View.SmallIcon;
}
private void CreateViewItemMethodOne()
{
ColumnHeader colHeader = new ColumnHeader();
colHeader.Text = "列标题1"; //设置列标题
this.listViewtest.Columns.Add(colHeader); //将列头添加到ListView控件。
this.listViewtest.Columns.Add("列标题2" );
this.listViewtest.Columns.Add("列标题3" );
this.listViewtest.BeginUpdate();
for (int i = 0; i < 9; i++) //添加10行数据
{
ListViewItem lvi = new ListViewItem();
listViewtest.SmallImageList = imageList1;
lvi.ImageIndex = i; //通过与imageList绑定,显示imageList中第i项图标
lvi.Text = "subitem" + i;
lvi.SubItems.Add("第2列,第" + i + "行");
lvi.SubItems.Add("第3列,第" + i + "行");
this.listViewtest.Items.Add(lvi);
}
this.listViewtest.EndUpdate(); //结束数据处理,UI界面一次性绘制。
}
Largelcon模式:
关键代码修改:
this.listViewtest.View = View.LargeIcon;
listViewtest.LargeImageList = imageList2;//这里imageList2是 32*32版本的
运行结果:
可以看到,标签在图片下方,正好验证了我们开篇的关于各种模式的一些区别中提到的区别。这里也没有列标头。、