我有一个列表框,列出某个目录中的某些文件。 我添加了一个消息框,当我点击任何列表项时,它会显示文件的路径。 但是,当我单击列表框中的任何文件名,而不是显示实际路径时,它会显示项目文件路径。
以下是我的代码:
private void btnrecprefresh_Click(object sender, EventArgs e)
{
string[] files = Directory.GetFiles(@"C:\testt", "*.txt", SearchOption.AllDirectories);
foreach (string f in files)
{
string modelpath = Path.GetFullPath(f);
string entry = Path.GetFileName(f);
Listbox.Items.Add(entry);
}
}
private void Listbox_SelectedIndexChanged(object sender, EventArgs e)
{
string selectedItems = Listbox.SelectedItems.ToString();
string all = Path.GetFullPath(selectedItems);
MessageBox.Show(all);
}
它不是将路径显示为C:\ testt \ xyz.txt,而是将路径显示为C:\ Users \ Production \ Desktop \ Project1 \ bin \ Release \ System.Windows.Forms.ListBox + SelectedObjectCollection
为阿巴斯编辑:
public frmMain()
{
InitializeComponent();
Listbox.DisplayMember = "Title";
Listbox.ValueMember = "Path";
}
public class FileItem
{
public string Title { get; set; }
public string Path { get; set; }
}
private void btnrecprefresh_Click(object sender, EventArgs e)
{
string[] files = Directory.GetFiles(@"C:\testt", "*.txt", SearchOption.AllDirectories);
foreach (string f in files)
{
var fileItem = new FileItem { Title = Path.GetFileName(f), Path = Path.GetFullPath(f) };
Listbox.Items.Add(fileItem);
}
}
private void Listbox_SelectedIndexChanged(object sender, EventArgs e)
{
var selectedItems = ListBox1.SelectedItems.Cast<FileItem>();
var all = string.Join(Environment.NewLine, selectedItems.Select(x => x.Path));
MessageBox.Show(all);
}
答案 0 :(得分:2)
在以下行中:
string selectedItems = Listbox.SelectedItems.ToString();
您所做的只是调用对象上的ToString
。获取该对象的路径自然会为您提供C:\Users\...
路径。
实现目标的一种方法是创建一个充当所需信息容器的类:
public class FileItem
{
public string Title { get; set; }
public string Path { get; set; }
}
然后,当您阅读文件夹时,在列表框中填写文件的路径和标题:
string[] files = Directory.GetFiles(@"C:\Temp", "*.txt", SearchOption.AllDirectories);
foreach (string f in files)
{
var fileItem = new FileItem { Title = Path.GetFileName(f), Path = Path.GetFullPath(f) };
listBox1.Items.Add(fileItem);
}
在表单的构造函数中,添加以下行:
listBox1.DisplayMember = "Title";
listBox1.ValueMember = "Path";
字符串值对应于FileItem
类中的属性。在列表框的已更改事件中,将代码更改为以下内容:
var selectedItems = listBox1.SelectedItems.Cast<FileItem>();
var all = string.Join(Environment.NewLine, selectedItems.Select(x => x.Path));
MessageBox.Show(all);
这将创建一个字符串,其中包含在列表框中选择的文件的所有路径。
示例输出:
答案 1 :(得分:0)
如果仅提供文件名,则Path.GetFullPath方法返回当前目录路径:
此方法使用当前目录和当前卷信息 完全符合条件的路径。如果仅在路径中指定文件名, GetFullPath返回当前目录的完全限定路径。
这就是为什么在Listbox_SelectedIndexChanged
方法中返回当前目录路径的原因。
相反,您应该将文件的完整路径与列表框项目的文本分开保存,并使用Listbox_SelectedIndexChanged
方法检索它:
// btnrecprefresh_Click method
string[] files = Directory.GetFiles(@"C:\test", "*.txt", SearchOption.AllDirectories);
foreach (string f in files)
{
string entry = Path.GetFileName(f);
var item = new ListBoxItem() { Content = entry, Tag = f };
listbox.Items.Add(item);
}
// Listbox_SelectedIndexChanged method
var selectedItem = listbox.SelectedItem as ListBoxItem;
string path = selectedItem.Tag.ToString();
MessageBox.Show(path);