生成文件名列表,但没有文件路径
本文关键字:文件 路径 文件名 列表 | 更新日期: 2024-11-08 12:54:06
我有一个列表框,显示一组引用文本文件的文件名。我认为显示完整路径在美学上没有吸引力,所以我用Path.GetFileName
来切断目录部分。
但是现在当用户选择要打开的特定文件名时,我丢失了路径。这些文件可以位于本地计算机上的任何位置(目前)。
如何使用列表框,以便我可以显示漂亮的文件名,但也引用实际文件?
编辑:我喜欢为每个列表框项设置一个自定义包装类的想法。
我过去所做的是为要在 ListBox 中显示的对象创建一个包装类。 在此类中,重写ToString
要在列表框中显示的字符串。
当您需要获取所选项目的详细信息时,请将其强制转换为包装类并拉取所需的数据。
这是一个丑陋的例子:
class FileListBoxItem
{
public string FileFullname { get; set; }
public override string ToString() {
return Path.GetFileName(FileFullname);
}
}
用文件列表框项填充列表框:
listBox1.Items.Add(new FileListBoxItem { FileFullname = @"c:'TestFolder'file1.txt" })
获取所选文件的全名,如下所示:
var fileFullname = ((FileListBoxItem)listBox1.SelectedItem).FileFullname;
编辑
@user1154664在对原始问题的评论中提出了一个很好的观点:如果显示的文件名相同,用户将如何区分两个 ListBox 项?
这里有两个选项:
同时显示每个文件列表框项的父目录
为此,请将ToString
覆盖更改为:
public override string ToString() {
var di = new DirectoryInfo(FileFullname);
return string.Format(@"...'{0}'{1}", di.Parent.Name, di.Name);
}
在工具提示中显示文件列表框项的完整路径
为此,请在窗体上放置一个工具提示组件,并为 ListBox 添加一个 MouseMove
事件处理程序,以检索用户将鼠标悬停在FileLIstBoxItem
的 FileFullname
属性值。
private void listBox1_MouseMove(object sender, MouseEventArgs e) {
string caption = "";
int index = listBox1.IndexFromPoint(e.Location);
if ((index >= 0) && (index < listBox1.Items.Count)) {
caption = ((FileListBoxItem)listBox1.Items[index]).FileFullname;
}
toolTip1.SetToolTip(listBox1, caption);
}
当然,您可以将第二个选项与第一个选项一起使用。
列表框中工具提示的来源(接受的答案,代码重新格式化为我喜欢的风格)。
如果使用 WPF,请使用 ListBoxItem.Tag
存储每个项的完整路径。 或者,如果使用 WinForms,则可以创建一个自定义类,该类存储完整路径,但重写对象。ToString(),以便仅显示文件名。
class MyPathItem
{
public string Path { get; set; }
public override string ToString()
{
return System.IO.Path.GetFileName(Path);
}
}
...
foreach (var fullPath in GetFullPaths())
{
myListBox.Add(new MyPathItem { Path = fullPath });
}
我这样做
public class ListOption
{
public ListOption(string text, string value)
{
Value = value;
Text = text;
}
public string Value { get; set; }
public string Text { get; set; }
}
然后创建我的列表
List<ListOption> options = new List<ListOption>()
For each item in files
options.Add(new ListOption(item.Name, item.Value));
Next
绑定我的列表
myListBox.ItemSource = options;
然后获取我的值或文本
protected void List_SelectionChanged(...)
{
ListOption option = (ListOption) myListBox.SelectedItem;
doSomethingWith(option.Value);
}
只是这里的想法是主要的事情
就我个人而言,我不同意你的观点,即这对用户来说是丑陋的。显示完整路径可为用户提供明确的详细信息,并使他们能够对自己的选择或正在执行的操作充满信心。
我会使用 Dictionary
,使用项目索引作为键,使用此列表项的完整路径作为值。
Dictionary<int, string> pathDict = new Dictionary<int, string>();
pathDict.Add(0, "C:'SomePath'SomeFileName.txt");
...
以上可能是使用item.Tag
属性的最佳方法......
我希望这有所帮助。