1

我有一个列表框,显示一组引用文本文件的文件名。我认为显示完整路径在美学上没有吸引力,所以我习惯于Path.GetFileName切断目录部分。

但是现在当用户选择要打开的特定文件名时,我已经丢失了路径。这些文件可以位于本地计算机上的任何位置(目前)。

我怎样才能使用列表框,以便我可以显示漂亮的文件名,但也可以参考实际文件?

编辑:我喜欢为每个列表框项拥有一个自定义包装类的想法。

4

4 回答 4

2

我过去所做的是为我想在 ListBox 中显示的对象创建一个包装类。在此类中重写ToString为要在 ListBox 中显示的字符串。

当您需要获取所选项目的详细信息时,将其转换为包装类并提取您需要的数据。

这是一个丑陋的例子:

class FileListBoxItem
{
    public string FileFullname { get; set; }
    public override string ToString() {
        return Path.GetFileName(FileFullname);
    }
}

用 FileListBoxItems 填充您的 ListBox:

listBox1.Items.Add(new FileListBoxItem { FileFullname = @"c:\TestFolder\file1.txt" })

取回所选文件的全名,如下所示:

var fileFullname = ((FileListBoxItem)listBox1.SelectedItem).FileFullname;

编辑
@user1154664 在对您原来的问题的评论中提出了一个很好的观点:如果显示的文件名相同,用户将如何区分两个 ListBox 项?

这里有两个选项:

同时显示每个 FileListBoxItem 的父目录

为此,将ToString覆盖更改为:

public override string ToString() {
    var di = new DirectoryInfo(FileFullname);
    return string.Format(@"...\{0}\{1}", di.Parent.Name, di.Name);
} 

在工具提示中显示 FileListBoxItem 的完整路径

为此,在您的表单上放置一个 ToolTip 组件并MouseMove为您的 ListBox 添加一个事件处理程序,以检索用户将鼠标悬停在上方的FileFullname属性值。FileLIstBoxItem

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

当然,您可以将第二个选项与第一个选项一起使用。

ListBox 中工具提示的来源(已接受的答案,代码重新格式化为我喜欢的风格)。

于 2012-08-08T22:17:23.577 回答
1

如果使用ListBoxItem.TagWPF,则用于存储每个项目的完整路径。或者,如果使用 WinForms,您可以创建一个自定义类来存储完整路径,但会覆盖 object.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 });
}
于 2012-08-08T22:10:14.947 回答
1

我个人不同意你认为这对用户来说是丑陋的观点。显示完整路径为用户提供了明确的详细信息,并使他们对他们的选择或他们正在做的事情充满信心。

我会使用Dictionary, 使用项目索引作为键和此列表项的完整路径作为值。

Dictionary<int, string> pathDict = new Dictionary<int, string>();
pathDict.Add(0, "C:\SomePath\SomeFileName.txt");
...

以上可能是使用该item.Tag物业的最佳方式...

我希望这有帮助。

于 2012-08-08T22:15:15.870 回答
1

我这样做

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

只是这里的想法是主要的

于 2012-08-08T22:18:45.853 回答