在列表框中显示文件夹,在另一个列表框中显示子文件夹

Posted

技术标签:

【中文标题】在列表框中显示文件夹,在另一个列表框中显示子文件夹【英文标题】:Show folders in listbox and subfolders in another listbox 【发布时间】:2018-04-11 13:28:41 【问题描述】:

我正在尝试创建一个 Autocad 插件来预览 datagridview 中的缩略图

我有两个列表框,我想将它们绑定在一起并在 datagridview 中显示 .bmp

    listbox1 显示目录 listbox2 显示所选文件夹 (listbox1) 中的子文件夹 然后 .bmp 文件显示在 datagridview 中

我成功解决了第一个问题

String[] dirs = System.IO.Directory.GetDirectories(@"D:\test\Blocks");
        int i;
        for (i = 0; i < dirs.Length; i++)
        
            listBox1.Items.Add(Path.GetFileName(dirs[i]));
        

        String[] files = System.IO.Directory.GetFiles(@"D:\test\Blocks");
        for (i = 0; i < files.Length; i++)
        
            listBox1.Items.Add(Path.GetFileName(files[i]));
        

【问题讨论】:

我试过 if (listBox1.SelectedItem != null) listBox2.Items.Add(listBox1.SelectedItem); 循环遍历 ListBox1 中所选文件夹的 GetFiles。 【参考方案1】:

If I understand you correctly, the first listbox lists subfolders, and when one is selected, the second listbox shows the subfolders of the selected item, and when one of those is selected, the datagridview shows the files in that folder.

如果正确,一种方法是在 Form_Load 事件中将 listbox1 的数据源设置为根目录。然后在该列表框的 SelectedIndexChanged 事件中,您可以将 listbox2 的数据源设置为在 listbox1 中选择的项目。并且在listbox2的SelectedIndexChanged事件中,可以将DataGridView的数据源设置为listbox2中选中的项目。

类似这样的:

public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();
    

    private string rootDirectory = @"D:\test\Blocks";

    private void Form1_Load(object sender, EventArgs e)
    
        listBox1.DataSource = Directory.GetDirectories(rootDirectory)
            .Select(Path.GetFileName).ToList();
        listBox1.SelectedIndexChanged += ListBox1_SelectedIndexChanged;
        listBox2.SelectedIndexChanged += ListBox2_SelectedIndexChanged;
    

    private void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
    
        var parentDir = Path.Combine(rootDirectory, listBox1.SelectedItem.ToString());
        listBox2.DataSource = Directory.GetDirectories(parentDir)
            .Select(Path.GetFileName).ToList();
    

    private void ListBox2_SelectedIndexChanged(object sender, EventArgs e)
    
        var parentDir = Path.Combine(rootDirectory, listBox1.SelectedItem.ToString(), 
            listBox2.SelectedItem.ToString());
        dataGridView1.DataSource = Directory.GetFiles(parentDir)
            .Select(f => new  FileName = Path.GetFileName(f) ).ToList();
    

【讨论】:

感谢它的工作,但还有另一个问题:两个列表框显示完整路径。我需要他们只显示文件名 您可以使用Path.GetFileName 从路径中获取文件或目录名称(无论路径的最后部分是什么),我们可以将其设置为数据源。但是如果我们这样做,那么我们需要在设置数据源时构造路径,因为整个路径不再存储在列表框中。我更新了上面的代码来做到这一点。如果您对此有任何疑问,请告诉我。 非常感谢@Rufus L 的回答,效果很好 对不起@Rufus 但是datagridview显示红色x显示.bmp文件的瞬间DataGridViewImageColumn dgvimgcol = new DataGridViewImageColumn(); dgvimgcol.ImageLayout = DataGridViewImageCellLayout.Stretch; dgvimgcol.Width = 250; dgvimgcol.HeaderText = "块"; dgvimgcol.Image = null; dataViewImages.RowTemplate.Height = 300; dataViewImages.Columns.Add(dgvimgcol); dataViewImages.AllowUserToAddRows = false; dataViewImages.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; 如果这在一个月前有效,而现在却没有,我想你必须看看从那时起发生了什么变化(无论是在代码中还是在文件系统上)。如果您在调试时遇到困难,请随时提出新问题!

以上是关于在列表框中显示文件夹,在另一个列表框中显示子文件夹的主要内容,如果未能解决你的问题,请参考以下文章

急!如何VB文件列表框双击文件名在文本框中显示文件内容?

根据 Access 列表框中的选择打开子表单

显示其目录中的图片的列表框

select列表框中的option选项显示图片

如何重命名列表框中所有文件的后缀?

在列表框中显示表名 (VB)