You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET 2013中如何用ListBox/ListView实现受限目录浏览器?

在VB.NET 2013中实现受限目录浏览器(ListBox/ListView版)

当然可以实现!不管是ListBox还是ListView都能搞定这个类似魔兽3地图选择的受限目录浏览器,我给你分别讲两种方案的具体实现步骤,都是VB.NET 2013里能直接跑的代码~

一、ListBox实现方案

ListBox是最轻量化的选择,逻辑简单易上手,完全符合你的需求:

1. 准备工作

先在窗体上拖一个ListBox控件(命名为lbDirectoryBrowser),然后在窗体类里声明两个核心变量,用来限制根目录和跟踪当前浏览的路径:

' 你要限制的根目录,改成自己的目标路径
Private ReadOnly RootPath As String = "C:\YourGameMapsFolder"
' 当前正在浏览的目录
Private CurrentPath As String

2. 初始化加载根目录

在窗体的Load事件里初始化当前路径,并加载根目录的内容:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    CurrentPath = RootPath
    LoadDirectoryItems(CurrentPath)
End Sub

3. 编写目录加载方法

这个方法负责清空ListBox、添加返回上级选项(非根目录时)、加载当前目录的所有子文件夹:

Private Sub LoadDirectoryItems(targetPath As String)
    lbDirectoryBrowser.Items.Clear()
    
    ' 只有不在根目录时,才显示返回上级的选项
    If Not targetPath.Equals(RootPath, StringComparison.OrdinalIgnoreCase) Then
        lbDirectoryBrowser.Items.Add(".. (返回上级)")
    End If
    
    ' 加载当前目录下的所有子文件夹
    Try
        Dim dirs As String() = Directory.GetDirectories(targetPath)
        For Each dir In dirs
            ' 只显示文件夹名称,不显示完整路径,更友好
            lbDirectoryBrowser.Items.Add(Path.GetFileName(dir))
        Next
    Catch ex As Exception
        MessageBox.Show("加载目录失败: " & ex.Message)
    End Try
End Sub

4. 处理点击事件

当用户点击ListBox里的项时,判断是返回上级还是进入子文件夹,同时做路径校验防止跳出根目录:

Private Sub lbDirectoryBrowser_Click(sender As Object, e As EventArgs) Handles lbDirectoryBrowser.Click
    ' 没有选中项就直接返回
    If lbDirectoryBrowser.SelectedIndex = -1 Then Return
    
    Dim selectedItem As String = lbDirectoryBrowser.SelectedItem.ToString()
    
    If selectedItem.Equals(".. (返回上级)") Then
        ' 返回上级目录
        CurrentPath = Directory.GetParent(CurrentPath).FullName
        LoadDirectoryItems(CurrentPath)
    Else
        ' 拼接选中文件夹的完整路径
        Dim newPath As String = Path.Combine(CurrentPath, selectedItem)
        ' 关键校验:确保新路径在根目录范围内,防止意外跳出
        If newPath.StartsWith(RootPath, StringComparison.OrdinalIgnoreCase) Then
            CurrentPath = newPath
            LoadDirectoryItems(CurrentPath)
        End If
    End If
End Sub

二、ListView实现方案

如果你想要更美观的界面(比如大图标、列表视图),ListView是更好的选择,逻辑和ListBox基本一致,只是控件操作略有不同:

1. 准备工作

拖一个ListView控件到窗体(命名为lvDirectoryBrowser),可以设置View属性为LargeIcon或者Details(后者需要添加列),同样声明核心变量:

Private ReadOnly RootPath As String = "C:\YourGameMapsFolder"
Private CurrentPath As String

2. 初始化和加载方法

在窗体Load事件里初始化ListView的样式,然后加载根目录内容:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' 如果用Details模式,添加一列显示文件夹名称
    lvDirectoryBrowser.Columns.Add("文件夹名称")
    lvDirectoryBrowser.View = View.Details
    lvDirectoryBrowser.FullRowSelect = True ' 整行选中更方便
    
    CurrentPath = RootPath
    LoadListViewDirectoryItems(CurrentPath)
End Sub

Private Sub LoadListViewDirectoryItems(targetPath As String)
    lvDirectoryBrowser.Items.Clear()
    
    ' 非根目录添加返回上级项
    If Not targetPath.Equals(RootPath, StringComparison.OrdinalIgnoreCase) Then
        Dim upItem As New ListViewItem(".. (返回上级)")
        lvDirectoryBrowser.Items.Add(upItem)
    End If
    
    ' 加载子文件夹
    Try
        Dim dirs As String() = Directory.GetDirectories(targetPath)
        For Each dir In dirs
            Dim folderItem As New ListViewItem(Path.GetFileName(dir))
            lvDirectoryBrowser.Items.Add(folderItem)
        Next
    Catch ex As Exception
        MessageBox.Show("加载目录失败: " & ex.Message)
    End Try
End Sub

3. 处理点击事件

逻辑和ListBox完全一致,只是获取选中项的方式略有不同:

Private Sub lvDirectoryBrowser_Click(sender As Object, e As EventArgs) Handles lvDirectoryBrowser.Click
    ' 没有选中项直接返回
    If lvDirectoryBrowser.SelectedItems.Count = 0 Then Return
    
    Dim selectedItem As String = lvDirectoryBrowser.SelectedItems(0).Text
    
    If selectedItem.Equals(".. (返回上级)") Then
        CurrentPath = Directory.GetParent(CurrentPath).FullName
        LoadListViewDirectoryItems(CurrentPath)
    Else
        Dim newPath As String = Path.Combine(CurrentPath, selectedItem)
        ' 同样做路径校验,确保不会跳出根目录
        If newPath.StartsWith(RootPath, StringComparison.OrdinalIgnoreCase) Then
            CurrentPath = newPath
            LoadListViewDirectoryItems(CurrentPath)
        End If
    End If
End Sub

额外优化建议

  • 添加图标:可以给返回上级项添加“向上”的文件夹图标,给子文件夹添加普通文件夹图标,让界面更贴近游戏里的样式(可以用SystemIcons或者自定义图标)
  • 权限处理:如果目标目录有访问权限限制,要在异常处理里做更友好的提示
  • 禁止编辑:确保ListBox的ReadOnly设为True、ListView的LabelEdit设为False,防止用户修改项内容

内容的提问来源于stack exchange,提问作者user9575469

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:11:29