《C#入门经典(第5版)》第15章Windows编程基础,本章介绍创建Windows应用程序时最常用的一些控件,并讨论如何使用它们创建简单而强大的用户界面。还论述这些控件的属性和事件,列出了使用它们的示例,解释了如何为控件的特定事件添加处理程序。本节为大家介绍ImageList控件。
15.8.6 ImageList控件(3)
代码段Chapter15\ListView\Form1.cs.
示例的说明
在第一个foreach块中,对ListView控件调用了BeginUpdate()。ListView控件上的BeginUpdate()方法告诉ListView控件,停止更新其可见区域,直到调用了EndUpdate()为止。如果没有调用这个方法,列表视图的填充就会进行得更加缓慢,列表可能在填充选项时闪烁。在第二个foreach块的后面调用了EndUpdate(),就可以使ListView控件显示出填充到它里面的内容。
这两个foreach块包含了我们感兴趣的代码。首先创建ListViewItem的一个新实例,再把Text属性设置为要插入的文件名或文件夹名。ListViewItem的ImageIndex表示其中一个ImageList中的选项索引。所以两个ImageList中的图标有相同的索引是非常重要的。使用Tag属性保存文件夹和文件的完全限定路径,在用户双击选项时,将使用该路径。
然后创建两个子选项,将要显示的文本赋给这两个子选项,再把它们添加到ListViewItem的SubItems集合中。
最后,把ListViewItem添加到ListView的Items集合中。ListView非常聪明,知道如果视图模式不是Details,就应忽略子选项。所以,现在无论视图模式是什么,都可以增加子选项。
注意代码的某些方面没有讨论,即实际获取文件信息的代码行:
- // Get information about the root folder.
- DirectoryInfo dir = new DirectoryInfo(root);
- // Retrieve the files and folders from the root folder.
- DirectoryInfo[] dirdirs = dir.GetDirectories();
- FileInfo[] files = dir.GetFiles();
这些代码使用System.IO名称空间中的类访问文件,所以需要在代码顶部的using区域添加如下代码:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Windows.Forms;
- using System.IO;
第24章将详细介绍文件访问和System.IO名称空间,但现在应明白,DirectoryInfo对象上的GetDirectories()方法返回一个对象集合,它们表示所查看的目录下的文件夹,GetFiles()方法返回一个对象集合,它们表示当前目录下的文件。可以迭代这些集合,如上面的代码所示,使用对象的Name属性返回相关目录或文件的名称,创建一个ListViewItem来保存这个字符串。
剩下的就是列表视图应显示根文件夹,为此,在窗体的构造函数中调用两个函数。同时用根文件夹实例化folderCol StringCollection字符串集合:
- InitializeComponent();
- folderCol = new System.Collections.Specialized.StringCollection();
- CreateHeadersAndFillListView();
- PaintListView(@"C:\");
- folderCol.Add(@"C:\");
为了允许用户通过双击ListView中的选项来浏览文件夹,需要订阅ItemActivate事件。在设计器中选择ListView,在Properties窗口的Events列表中双击ItemActivate事件。
对应的事件处理程序如下所示:
- private void listViewFilesAndFolders_ItemActivate(object
sender, EventArgs e)- {
- System.Windows.Forms.ListView lw =
(System.Windows.Forms.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);
- }}
选中项的Tag包含被双击的文件或文件夹的完全限定路径。索引为0的图像是一个文件夹,所以查看索引就可以确定哪个选项是文件,哪个选项是文件夹。如果选项是一个文件,就试着加载它。如果选项是一个文件夹,就通过新文件夹调用PaintListView(),再把新文件夹添加到folderCol集合中。
在讨论单选按钮前,先给Back按钮添加Click事件,提供完整的浏览功能。双击该按钮,为事件处理程序添加如下代码:
- 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());
- }