在列表框中显示文件夹,在另一个列表框中显示子文件夹
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;
如果这在一个月前有效,而现在却没有,我想你必须看看从那时起发生了什么变化(无论是在代码中还是在文件系统上)。如果您在调试时遇到困难,请随时提出新问题!以上是关于在列表框中显示文件夹,在另一个列表框中显示子文件夹的主要内容,如果未能解决你的问题,请参考以下文章