下面是详细讲解“c#用Treeview实现FolderBrowerDialog 和动态获取系统图标”的攻略。
一、实现FolderBrowerDialog
实现FolderBrowerDialog有很多种方式,这里我们介绍一种使用TreeView控件来实现。TreeView可以创建一个类似于Windows资源管理器的层次结构,同时可以响应点击事件。我们可以利用这个层次结构来展示文件目录树,选择文件夹。
1.1 创建TreeView控件
在Windows Form窗体上拖拽一个TreeView控件。
1.2 添加与更新目录树
下面是示例代码,展示如何遍历文件夹并添加到TreeView中。
private void AddDirectories(TreeNode node)
{
try
{
DirectoryInfo[] directories = null;
if (node == null)
{
directories = DriveInfo.GetDrives()
.Where(d => d.IsReady)
.Select(d => d.RootDirectory)
.ToArray();
}
else
{
directories = new DirectoryInfo(node.FullPath)
.GetDirectories()
.ToArray();
}
foreach (var directory in directories)
{
TreeNode directoryNode = node == null ? treeView1.Nodes.Add(directory.FullName)
: node.Nodes.Add(directory.FullName);
DirectoryInfo[] subDirectories = directory.GetDirectories();
if (subDirectories.Length > 0)
{
directoryNode.Nodes.Add(new TreeNode());
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
1.3 响应点击事件
下面是示例代码,展示如何在TreeView中选择文件夹并显示其目录。
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
try
{
if (e.Node.Nodes.Count > 0 && e.Node.Nodes[0].Text == "")
{
e.Node.Nodes.Clear();
AddDirectories(e.Node);
}
textBox1.Text = e.Node.FullPath;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
1.4 触发FolderBrowerDialog
下面是示例代码,展示如何使用TreeView来选择文件夹。
private void button1_Click(object sender, EventArgs e)
{
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
treeView1.Nodes.Clear();
AddDirectories(null);
}
}
二、动态获取系统图标
有时候我们需要在程序中展示系统文件或者文件夹的图标,比如在TreeView中展示。我们可以通过使用Win32 DLL类库来实现这个功能。
2.1 引用Win32 DLL类库
我们可以使用DllImport来引用Win32 DLL类库。下面是DllImport的使用示例:
[DllImport("shell32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName,
int nIconIndex);
2.2 获取系统图标
下面是示例代码,展示如何获取系统文件夹的图标。
private void AddIcon(TreeNode node)
{
try
{
SHFILEINFO shfi = new SHFILEINFO();
uint flags = SHGFI_SYSICONINDEX | SHGFI_SMALLICON;
IntPtr hIcon = SHGetFileInfo(node.FullPath, 0, ref shfi,
(uint)Marshal.SizeOf(shfi), flags);
Icon icon = Icon.FromHandle(hIcon);
imageList1.Images.Add(icon);
node.ImageIndex = imageList1.Images.Count - 1;
node.SelectedImageIndex = node.ImageIndex;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
2.3 调用AddIcon
下面是示例代码,展示如何调用AddIcon方法。
private void AddDirectories(TreeNode node)
{
try
{
//…
foreach (var directory in directories)
{
TreeNode directoryNode = node == null ? treeView1.Nodes.Add(directory.FullName)
: node.Nodes.Add(directory.FullName);
AddIcon(directoryNode);
//…
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
以上是使用C#实现FolderBrowerDialog和动态获取系统图标的攻略。使用TreeView来实现FolderBrowerDialog,使用Win32 DLL类库来获取系统图标。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#用Treeview实现FolderBrowerDialog 和动态获取系统图标(运用了Win32 dll类库) - Python技术站