ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

呈现一个 Windows 列表视图控件,并且能够以四种不同的视图中的任何一种来显示一个子项集合。

  • 命名空间:System.Windows.Forms
  • 汇编集:System.Windows.Forms(在 system.windows.forms.dll 中)

语法

[ClassInterfaceAttribute(ClassInterfaceType.AutoDispatch)] 
[ComVisibleAttribute(true)] 
public class ListView : Control

备注

ListView 控件允许你以子项的文本以及一个用来识别子项类型的可选的图标来显示子项列表。例如,Windows Explorer 中的文件列表的外观就类似于一个 ListView 控件。它在树中显示出了当前被选中的文件与目录的列表。并且每个文件与目录都显示了一个相关的图标来帮助识别文件或者目录的类型。ListViewItem 类用来在 ListView 控件中呈现一个子项。在列表中被显示的子项能够显示成五种不同视图中的任何一种。子项能够被显示成大图标、小图标,或者垂直列表中的小图标。子项同样能够拥有包含上级子项相关信息的下级子项。详细视图允许你在一个拥有对下级子项中被显示的信息进行识别的列头的网格中显示子项以及它的下级子项。但是,平铺视图的用途是有限的,与下面所描述的一样,它允许你在大图标的旁边包含文本信息的平铺方式来显示子项以及它的下级子项。另外,ListView 还支持单项选择与多项选择。多选特征让用户以类似于 ListBox 控件的方式来从子项的列表中进行选择。另外,用户还能够激活被选择的子项来完成相应的任务。例如,你可以使用一个 ListView 控件来显示一个应用程序能够打开并且进行利用的文件列表。用户能够选择要打开的文件然后通过双击来激活相应的子项以便在应用程序中打开这个文件。ListView 同样能够显示复选框,通过使用 CheckBoxes 属性来允许用户复选他们想要完成某个任务的子项。你可以通过多种不同的方式来使用 ListView 控件。这个控件能够被用来显示某个应用程序、某个数据库,或者某个文本文件的信息。ListView 同样能够被用来获取用户的信息(比如被选中的要进行处理的文件集)。

ListView 提供了很多属性来灵活地控制外观与行为。View 属性允许你改变子项被显示的方式。LargeImageList、SmallImageList,以及 StateImageList 属性允许你指定为子项显示图片的 ImageList 对象,关于 StateImageList,是指在 CheckBoxes 属性被设置成 true 的时候而被显示的复选框。要检测哪个子项是被复选中的,你就可以使用 CheckedItems 属性来访问 ListView.CheckedListViewItemCollection 集合。Columns 属性允许你对 ListView.ColumnHeaderCollection 进行访问,并且在该控件的 View 属性被设置成 Details 的时候可以用来存储被显示的列头。还可以通过 ListView 的 Items 属性能够用来添加或者删除子项。Items 属性允许你访问控件的 ListView.ListViewItemCollection 集合,该集合为操作控件的子项而提供了方法。如果你需要允许用户编辑子项的文字,那么你就可以使用 LabelEdit 属性。在你的控件中包含有大量子项的时候,以一个被排序的列表来显示它们经常能够为用户带来更多的便利。你可以使用 Sorting 属性来以字母顺序对子项进行排序。你同样也能够完全地自定义 ListView 控件的外观。要这样做,就需要把 OwnerDraw 属性设置成 true 并且对如下所示的一个或者多个事件进行处理:DrawItem、DrawSubItem,DrawColumnHeader。

ListView 控件的大多数属性在控件的 View 属性被设置成 Detail 的时候被使用。AllowColumnReorder 属性允许你的 ListView 控件的用户在运行时重新配置列的次序。FullRowSelect 属性允许以被选中的子项与它的下级子项来替代之前被选中的子项。如果要在详细视图中显示网格线来识别 ListView 中子项与下级子项的边界,那么你就可以使用 GridLines 属性。另外,HeaderStyle 属性还允许你指定列头的显示类型。

除了大多数为 ListView 而可用的属性之外,另外还有一些你的应用程序可以用来为 ListView 提供额外能力的方法与事件。BeginUpdate 与 EndUpdate 方法就允许你在为 ListView 添加许多子项并且防止控件每次都对被添加的子项进行重新绘制的时候来改进性能。如果你的 ListView 控件中显示了子项与下级子项,那么你就可能需要在用户右键单击一个下级子项的时候提供相应的功能。如果要检测子项中被单击的下级子项,那么你就可以使用 GetItemAt 方法。在用户编辑完子项并且完成了子项验证的时候,你可能需要显示一个特定的子项给用户来进行改变。另外,调用 EnsureVisible 方法能够还确保特定的子项能够位于控件的可见区域中。

如果 LabelEdit 属性被设置成 true,那么你就可以在通过为 BeforeLabelEdit 与 AfterLabelEdit 事件而创建事件处理器并且在文本被改变之前或者被改变之后对被编辑的文本进行验证。要打开文件或者显示对话框来编辑一个被显示在 ListView 中的子项,你就可以为 ItemActivate 事件创建一个事件处理器。如果你允许用户在单击列头的时候对 ListView 中的子项进行排序,那么你可以为 ColumnClick 事件创建一个事件处理器来完成排序任务。另外,在 CheckBoxes 属性被设置成 true 的时候,你还可以通过处理 ItemCheck 事件来对子项的复选状态的改变进行检测。

你同样可以通过 BackgroundImage 属性来为 ListView 设置一个背景图片。你的应用程序必须在它的 Main 方法中使用 STAThreadAttribute 来正确地显示 ListView 控件的背景图片。另外,如果指定了背景图片的 ListView 控件被托管在 Internet Explorer 中,那么就应该指定 comctl32.dll 的 6.0 版本作为应用程序证明文件的依赖汇编集来确保背景图片能够正确地被显示。

提示:在 .NET Framework 1.1 以及更早的版本中,设置 ListView 控件的 Cursor 属性并不会真正影响到鼠标指针的外观。

Windows XP 与 Windows Server 2003 会在你的应用程序调用了 Application.Enablevisual Styles 方法的时候为 ListView 控件提供三种增强的特性:平铺视图、分组,以及插入标记。

平铺视图能够让你在大图标的旁边显示子项与下级子项的文字来平衡图形与文字信息。通过把 View 属性设置成 View.Tile 就可以启用这个行为。

分组特性能够让你从视觉上把子项按照相关的目录进行分组。在你需要启用这个特性的时候可以使用 Groups 属性把 ListViewGroup 对象添加到 ListView 控件中。如果要临时禁用这个特性,那么可以把 ShowGroups 属性设置成 false。

插入标记特性能够让你以可视化的回馈信息来指出要拖放的位置来提供可拖放的子项重定位。你可以使用通过 InsertionMark 属性而被获取的 ListViewInsertionMark 对象来显示插入标记。

这些特性只在 Windows XP 与 Windows Server 2003 中才是可用的。而在较早版本的平台中,与这些特性相关联的代码将不起作用,例如,平铺视图会表现成大图标视图,并且插入标记与分组则不会被显示。但是在有些情况下,你可能需要编写代码来检测这些特性是否可用,并且需要在它们不可用的时候来提供相应的替代功能。因为这些特性是由为操作系统提供主题特性的相同的库而被提供,所以,要检查这些库的可用性,就可以调用 FeatureSupport.IsPreset(Object) 方法重载并且把 OSFeature.Themes 值作为参数进行传递。

下表说明了 ListView 的部分成员以及它们在哪种视图中才是有效的。

ListView 成员视图
Alignment 属性SmallIcon 或者 LargeIcon
AutoArrange 属性SmallIcon 或者 LargeIcon
AutoResizeColumn 方法Details
Columns 属性Details 或者 Tile
DrawSubItem 事件Details
FindItemWithText 方法Details、List,或者 Tile
FindNearestItem 方法SmallIcon 或者 LargeIcon
GetItemAt 方法Details 或者 Tile
Groups 属性除了 List 之外的所有视图
HeaderStyle 属性Details
InsertionMark 属性LargeIcon、SmallIcon、或者 Tile

范例

下列代码范例以三个被指定的 ListViewItem 对象以及分别为每个子项而被指定的三个 ListViewItem.ListViewSubItem 对象来创建一个 ListView 控件。这个范例同样创建了 ColumnHeader 对象在细节视图中显示下级子项。这个代码范例中同样也创建了两个 ImageList 对象来为 ListViewItem 对象提供图片。这些 ImageList 对象被添加到了 LargeImageList 与 SmallImageList 属性中。另外,这个范例还在创建 ListView 控件的过程中使用到了下列属性:

  • View
  • LabelEdit
  • AllowColumnReorder
  • CheckBoxes
  • FullRowSelect
  • GridLines
  • Sorting

这个范例需要你把代码添加到一个 Form 中并且从这个窗体的构造器或者其他方法中调用在范例中被创建的方法。这个范例同样需要在磁盘驱动器 C 的根目录中存在命名为 MySmallImage1、MySmallImage2、MyLargeImage1,以及 MyLargeImage2 的图片。

private void CreateMyListView()
{
    // 创建新的 ListView 控件。
    ListView listView1 = new ListView();
    listView1.Bounds = new Rectangle(new Point(10,10), new Size(300,200));

    // 设置视图来显示细节。
    listView1.View = View.Details;
    // 允许用户编辑子项的文字。
    listView1.LabelEdit = true;
    // 允许用户重新对列头进行排列。
    listView1.AllowColumnReorder = true;
    // 显示复选框。
    listView1.CheckBoxes = true;
    // 在产生选择的时候选择子项与下级子项。
    listView1.FullRowSelect = true;
    // 显示网格线。
    listView1.GridLines = true;
    // 以升序来对列表中的子项进行排列。
    listView1.Sorting = SortOrder.Ascending;

    // 分别为每个子项而创建三个子项与三个下级子项集。
    ListViewItem item1 = new ListViewItem("item1",0);
    // 把复选标记放到子项的前面。
    item1.Checked = true;
    item1.SubItems.Add("1");
    item1.SubItems.Add("2");
    item1.SubItems.Add("3");
    ListViewItem item2 = new ListViewItem("item2",1);
    item2.SubItems.Add("4");
    item2.SubItems.Add("5");
    item2.SubItems.Add("6");
    ListViewItem item3 = new ListViewItem("item3",0);
    // 把复选标记放到子项的前面。
    item3.Checked = true;
    item3.SubItems.Add("7");
    item3.SubItems.Add("8");
    item3.SubItems.Add("9");

    // 为子项与下级子项而创建列。
    listView1.Columns.Add("Item Column", -2, HorizontalAlignment.Left);
    listView1.Columns.Add("Column 2", -2, HorizontalAlignment.Left);
    listView1.Columns.Add("Column 3", -2, HorizontalAlignment.Left);
    listView1.Columns.Add("Column 4", -2, HorizontalAlignment.Center);

    //把子项添加到 ListView 中。
            listView1.Items.AddRange(new ListViewItem[]{item1,item2,item3});

    // 创建两个 ImageList 对象。
    ImageList imageListSmall = new ImageList();
    ImageList imageListLarge = new ImageList();

    // 使用位图来初始化 ImageList 对象。
    imageListSmall.Images.Add(Bitmap.FromFile("C:\\MySmallImage1.bmp"));
    imageListSmall.Images.Add(Bitmap.FromFile("C:\\MySmallImage2.bmp"));
    imageListLarge.Images.Add(Bitmap.FromFile("C:\\MyLargeImage1.bmp"));
    imageListLarge.Images.Add(Bitmap.FromFile("C:\\MyLargeImage2.bmp"));

    //把 ImageList 对象指派给 ListView。
    listView1.LargeImageList = imageListLarge;
    listView1.SmallImageList = imageListSmall;

    // 把 ListView 添加到控件集合中。
    this.Controls.Add(listView1);
}

继承层次

System.Object 
   System.MarshalByRefObject 
     System.ComponentModel.Component 
       System.Windows.Forms.Control 
        System.Windows.Forms.ListView

线程安全

这个类型中任何公开的静态(在 Visual Basic 中是 Shared)成员都是线程安全的。并且任何实例的成员都不能够保证是线程安全的。

posted on 2007-02-10 21:09  Laeb  阅读(2986)  评论(0编辑  收藏  举报