C#:为列表框项创建第二个标识符

C#: create a second identifier for a listbox item

我一直在编写一个报告系统。报告中的所有主要变量都存储在一个 .xml 文件中,然后一些相同的数据作为单个单词 .txt 文件存储在其他文件夹中,这些文件以与报告 main 相同的名称保存。 xml 文件。

当涉及到将所有报告加载到列表框中时,它们的显示名称会根据过滤器(所有|最新|最旧|优先级|A - Z|Z - A)更改,并且可能会有更多,然而,尽管它可以很好地显示和排序列表框项目,但在将报告加载到我编写的加载器中时,它需要所选列表框项目的目录。

最初当我做这个的时候,它们都是按文件名列出的,这显然工作得很好,因为列表框项目的显示名称使用了文件名。现在因为我让它更干净并包括过滤器,我不能完全使用相同的技术,所以我在想是否有办法向列表框项目添加第二个标识符,以便我可以将第二个标识符称为名称存储其数据的文件的一部分,以便我可以通过第二个标识符或可能具有相同结果的任何其他方式加载数据。

public void UpdateReports()
{
    if (ReportsPrioritySelection.Text == "All")
    {
        ReportsList.Items.Clear();

        SortDescription sd = new SortDescription("", ListSortDirection.Descending);

        DirectoryInfo dinfo = new DirectoryInfo(@"Report&Fix\Reports\");
        FileInfo[] Files = dinfo.GetFiles("*.xml");
        foreach (FileInfo file in Files)
        {
            ReportsList.Items.Add(Path.GetFileNameWithoutExtension(file.Name));
            ReportsList.Items.SortDescriptions.Add(sd);
        }
    }

    if (ReportsPrioritySelection.Text == "Newest")
    {
        ReportsList.Items.Clear();

        SortDescription sd = new SortDescription("", ListSortDirection.Descending);

        DirectoryInfo dinfo = new DirectoryInfo(@"Report&Fix\Reports\");
        FileInfo[] Files = dinfo.GetFiles("*.xml");
        foreach (FileInfo file in Files)
        {
            ReportsList.Items.Add(File.ReadAllText(@"Report&Fix\ReportData\Date\" + Path.GetFileNameWithoutExtension(file.Name) + ".txt") + " " + Path.GetFileNameWithoutExtension(file.Name));
            ReportsList.Items.SortDescriptions.Add(sd);
        }
    }
}

你可以做的是将列表绑定到你的项目集合,然后设置集合中的哪个 属性 应该是显示的,哪个应该是 'key'.

  var myItems = new List<SomeItem>() 
  {
    new SomeItem() { Id = 1, Name = "File1.txt" }, 
    new SomeItem() { Id = 2, Name = "File2.txt" }, 
    new SomeItem() { Id = 3, Name = "File3.txt" } 
  };

  ReportsList.DataSource = myItems;

  ReportsList.DisplayMember = "Name";

  ReportsList.ValueMember = "Id";
}

然后当您引用 ListItem 时,您可以 .ValueMember 获取 Id 以用于您的唯一引用。

因此,在您的情况下,您应该创建一个具有两个属性(Id 和 Path 或其他)的新对象,而不是只添加路径字符串,然后添加(因为 .Add 需要一个对象) .然后告诉它显示哪个属性,哪个是要查找的值