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

Show folders in listbox and subfolders in another listbox

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

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

  1. listbox1 显示目录
  2. listbox2 显示所选文件夹 (listbox1) 中的子文件夹
  3. 然后 .bmp 文件显示在数据网格视图中

第一题我算成功了

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]));
        }

如果我没理解错的话,第一个列表框会列出子文件夹,选中一个后,第二个列表框会显示所选项目的子文件夹,选中其中一个后,datagridview 会显示该文件夹中的文件.

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

像这样:

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();
    }
}