ListView列表视图控件通常用于显示数据,用户可以对这些数据和显示方式进行某些控制。还可以把包含在控件中的数据显示为列和行(像网格一样),或者显示为一列,或者显示为图标表示。
其实列表视图控件的作用,就像我们平时浏览windows文件夹一样,可以以“列表”、“平铺”、“详细信息”、“大图标”等方式显示某一目录下的文件夹和文件。
1. ListView控件的属性
属性 | 说明 |
Activation | 使用这个属性,可以控制用户在列表视图中激活选项的方式,可能的值如下: Standard:这个设置是用户为自己的计算机选择的值; OneClick:单击一个选项,激活它; TwoClick:双击一个选项,激活它。 |
Alignment | 这个属性可以控制列表视图中选项的对齐方式,有4个可能的值: Default:如果用户拖放一个选项,它将仍位于拖动前的位置; Left:选项与ListView控件的左边界对齐; Top:选项与ListView控件的顶边界对齐; SnapToGrid:ListView控件包含一个不可见的网格,选项都放在该网格中。 |
AllowColumnReorder | 如果把这个属性设为true,就允许用户改变列表视图中列的顺序。 |
AutoArrange | 如果把这个属性设置为true,选项会自动根据Alignment属性排序。如果用户把一个选项拖放到列表视图的中央,且Alignment是Left,则选项会自动左对齐。只有在View属性是LargeIcon或SmallIcon时,这个属性才有意义。 |
CheckBoxes | 如果把这个属性设置为true,列表视图中的每个选项会在其左边显示一个复选框。只有在View属性是Detail或List时,这个属性才有意义。 |
CheckedIndices CheckedItems | 这两个属性可以分别访问索引和选项的集合,该集合包含列表中被选中的选项。 |
Columns | 列表视图可以包含列。通过这个属性可以访问列集合,通过该集合,可以增加或删除列。 |
FocusedItem | 这个属性包含列表视图中有焦点的选项。如果没有选择任何选项,该属性就为null。 |
FullRowSelect | 这个属性为true时,单击一个选项,该选项所在的整行文本都会突出显示。如果该属性为false,则只选项本身会突出显示。 |
GridLines | 把这个属性设置为true,则列表视图会在行和列之间绘制网格线。只有View属性为Details时,这个属性才有意义。 |
HeaderStyle | 可以控制列标题的显示方法,有3中样式: Clickable:列标题显示为一个按钮; NonClickable:列标题不响应鼠标单击事件; None:不显示列标题。 |
HoverSelection | 这个属性为true时,用户可以把鼠标指针放在列表视图的一个选项上,以选择它。 |
Items | 列表视图中的选项集合。 |
LabelEdit | 这个属性设置为true时,用户可以在Details视图下编辑第一列的内容。 |
LabelWrap | 这个属性设置为true时,标签就会自动换行,以便显示所有文本。 |
LargeImageList | 这个属性包含ImageList,而ImageList包含大图像。这些图像可以在View属性为LargeIcon时使用。 |
MultiSelect | 这个属性设置为true时,用户可以选择多个选项。 |
Scrollable | 这个属性设置为true时,就显示滚动条。 |
SelectedIndices SelectedItems | 这两个属性分别包含选中索引和选项的集合。 |
SmallImageList | 当View属性为SmallIcon时,这个属性包含了ImageList,其中ImageList包含了要使用的图像。 |
Sorting | 可以让列表视图对它包含的选项排序,有3中模式:Ascending,Descending,None。 |
StateImageList | ImageList包含图像的蒙版,这些图像蒙版可用作LargeImageList和SmallImageList图像的覆盖图,表示定制的状态 |
TopItem | 返回列表视图顶部的选项 |
View | 列表视图可以用4种不同的基本模式显示其选项: LargeIcon:所有选项都在其旁边显示一个大图标(32*32)和一个标签; SmallIcon:所有选项都在其旁边显示一个大图标(16*16)和一个标签; List:只显示一列,该列可以包含一个图标和一个标签; Details:可以显示任意数量的列,只有第一列可以包含图标; Tile:显示一个大图标和一个标签,在图标的右边显示子项信息; |
2. ListView控件的方法
方法 | 说明 |
BeginUpdate() | 调用这个方法,将告诉列表视图开始更新,直到调用EndUpdate()为止。当一次插入多个选项时,使用这个方法很有用,因为它会禁止视图,大大提高速度。 |
Clear() | 彻底清除列表视图,删除所有的选项和列。 |
EndUpdate() | 在调用BeginUpdate()之后调用这个方法,在调用这个方法时,列表视图会显示其所有选项。 |
EnsureVisible() | 在调用这个方法时,列表视图会滚动,以显示指定索引的选项 |
GetItemAt() | 返回列表视图中位于x,y位置的选项 |
3. ListView控件的事件
事件 | 说明 |
AfterLabelEdit | 在编辑了标签后,引发该事件 |
BeforeLabelEdit | 在用户开始编辑标签前,引发该事件 |
ColumnClick | 在单击一个列时,引发该事件 |
ItemActivate | 在激活一个选项时,引发该事件 |
4. ListViewItem
列表视图中的选项总是ListViewItem类的一个实例。ListViewItem包含要显示的信息,如文本和图标的索引。ListViewItem对象有一个SubItems属性,包含ListViewSubItem类的实例。ListView控件处于Details或Tile模式下,这些子选项就会显示出来。子选项和主选项之间的区别是子选项不能显示图标。
5. ColumnHeader
要使列表视图显示列标题,需要把类ColumnHeader的实例添加到ListView的Columns集合中。
6.ImageList控件
ImageList图像列表控件提供了一个集合,可以用于存储在窗体的其他控件中使用的图像。可以在图像列表中存储任意大小的图像,但同一个图像列表控件中的每个图像的大小必须相同。对于ListView,则需要两个ImageList控件,显示大图像和小图像。
ImageList图像列表控件位于“工具箱”中“组件”类别。
7.示例
以下示例代码是以ListView控件显示C盘目录下的文件夹和文件,支持“List”、“Details”等多种方式的切换,支持访问下层目录和返回上一级目录。初始显示方式是以“Details”详细信息的方式显示,包含“Filename”、“size”和“Last accessed”三个列标题。
using System.IO;
namespace Ch15Ex01
{
public partial class Form1 : Form
{
private System.Collections.Specialized.StringCollection folderCol;
//创建列标题,并添加到列表视图控件中
private void CreateHeadersAndFillListView()
{
ColumnHeader colHead;
//添加“Filename”列标题
colHead = new ColumnHeader();
colHead.Text = "Filename";
ListViewFileAndFloder.Columns.Add(colHead);
//添加“Size”列标题
colHead = new ColumnHeader();
colHead.Text = "Size";
ListViewFileAndFloder.Columns.Add(colHead);
//添加“Last accessed”列标题
colHead = new ColumnHeader();
colHead.Text = "Last accessed";
ListViewFileAndFloder.Columns.Add(colHead);
}
private void PaintListView(string root)
{
try
{
ListViewItem lvi;
ListViewItem.ListViewSubItem lvsi;
if (string.IsNullOrEmpty(root)) return;
//当前目录
DirectoryInfo dir = new DirectoryInfo(root);
//当前目录的所有子目录,即文件夹
DirectoryInfo[] dirs = dir.GetDirectories();
//当前目录下的文件
FileInfo[] files = dir.GetFiles();
//清空
ListViewFileAndFloder.Items.Clear();
ListViewFileAndFloder.BeginUpdate();
//遍历所有文件夹
foreach (DirectoryInfo di in dirs)
{
lvi = new ListViewItem();
lvi.Text = di.Name; //保存文件夹名
lvi.ImageIndex = 0; //索引为0
lvi.Tag = di.FullName; //保存文件夹完全路径
//如果是文件夹则忽略文件夹的大小
lvsi = new ListViewItem.ListViewSubItem();
lvsi.Text = "";
lvi.SubItems.Add(lvsi);
//最后访问时间
lvsi = new ListViewItem.ListViewSubItem();
lvsi.Text = di.LastAccessTime.ToString();
lvi.SubItems.Add(lvsi);
//添加到Items集合中
ListViewFileAndFloder.Items.Add(lvi);
}
foreach (FileInfo fi in files)
{
lvi = new ListViewItem();
lvi.Text = fi.Name; //保存文件名
lvi.ImageIndex = 1; //索引为0
lvi.Tag = fi.FullName; //保存文件完全路径
//获得文件大小
lvsi = new ListViewItem.ListViewSubItem();
lvsi.Text = fi.Length.ToString();
lvi.SubItems.Add(lvsi);
//最后访问时间
lvsi = new ListViewItem.ListViewSubItem();
lvsi.Text = fi.LastAccessTime.ToString();
lvi.SubItems.Add(lvsi);
//添加到Items集合中
ListViewFileAndFloder.Items.Add(lvi);
}
ListViewFileAndFloder.EndUpdate();
}
catch (System.Exception err)
{
MessageBox.Show("Error:"+ err.Message);
}
}
public Form1()
{
InitializeComponent();
folderCol = new System.Collections.Specialized.StringCollection();
//为列表视图控件创建列标题
CreateHeadersAndFillListView();
//绘制C盘目录下的文件夹和文件
PaintListView(@"C:\");
//添加C盘搜索目录
folderCol.Add(@"C:\");
}
//列表视图控件的显示模式切换为大图标模式
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
RadioButton rdb = (RadioButton)sender;
if (rdb.Checked)
{
ListViewFileAndFloder.View = View.LargeIcon;
}
}
//列表视图控件的显示模式切换为小图标模式
private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
RadioButton rdb = (RadioButton)sender;
if (rdb.Checked)
{
ListViewFileAndFloder.View = View.SmallIcon;
}
}
//列表视图控件的显示模式切换为列表模式
private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
RadioButton rdb = (RadioButton)sender;
if (rdb.Checked)
{
ListViewFileAndFloder.View = View.List;
}
}
//列表视图控件的显示模式切换为详细信息模式
private void radioButton4_CheckedChanged(object sender, EventArgs e)
{
RadioButton rdb = (RadioButton)sender;
if (rdb.Checked)
{
ListViewFileAndFloder.View = View.Details;
}
}
//列表视图控件的显示模式切换为平铺模式
private void radioButton5_CheckedChanged(object sender, EventArgs e)
{
RadioButton rdb = (RadioButton)sender;
if (rdb.Checked)
{
ListViewFileAndFloder.View = View.Tile;
}
}
//点击“back”按钮,返回上级目录
//其原理是确保folderCol集合中最后一个选项始终为当前目录的完整路径
private void buttonBack_Click(object sender, EventArgs e)
{
if (folderCol.Count > 1)
{
PaintListView(folderCol[folderCol.Count - 2].ToString());
folderCol.RemoveAt(folderCol.Count - 1);
}
else
{
PaintListView(folderCol[0].ToString());
}
}
//双击控件中的每一文件夹或文件继续访问
private void ListViewFileAndFloder_ItemActivate(object sender, EventArgs e)
{
ListView lw = (ListView)sender;
string filename = lw.SelectedItems[0].Tag.ToString();
if (lw.SelectedItems[0].ImageIndex != 0)
{
try
{
//打开文件
System.Diagnostics.Process.Start(filename);
}
catch
{
return;
}
}
else
{
PaintListView(filename);
folderCol.Add(filename);
}
}
}
}
其初始显示结果如下图所示:
将显示模式切换为“Title”,显示如下:
其中文件夹和文件图标是外部导入的ico图标,保存在ImageList控件中。