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

C#:为列表框项目创建第二个标识符,c#,.net,listbox,listboxitem,C#,.net,Listbox,Listboxitem,我一直在编写一个报告系统。报告中的所有主要变量都存储在一个.xml文件中,然后一些相同的数据作为单个word.txt文件存储在其他文件夹中,这些文件以与报告main.xml文件相同的名称保存 当要将所有报告加载到一个列表框中时,它们的显示名称会根据过滤器(所有|最新|最旧|优先级| a-Z | Z-a)进行更改,并且可能会有更多的报告,但是,尽管它可以很好地显示和排序列表框项目,当要将报告加载到我编写的加载程序中时,它需要所选列表框项的目录 最初,当我这样做的时候,它们都是按文件名列出的,这显然

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

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

最初,当我这样做的时候,它们都是按文件名列出的,这显然效果很好,因为文件名是由listbox项的显示名使用的。现在,因为我正在使它更干净,包括过滤器,我不能完全使用相同的技术,所以我在想,是否有一种方法可以将第二个标识符添加到列表框项目中,以便我可以调用第二个标识符,即其数据存储在其中的文件的名称,这样我就可以通过第二个标识符加载数据,或者可能通过任何其他具有相同结果的方式加载数据

public void UpdateReports()
{
如果(ReportsPrioritySelection.Text==“全部”)
{
ReportsList.Items.Clear();
SortDescription sd=新的SortDescription(“,ListSortDirection.Descending);
DirectoryInfo dinfo=新的DirectoryInfo(@“报告和修复\\报告\\\”);
FileInfo[]Files=dinfo.GetFiles(“*.xml”);
foreach(文件中的文件信息文件)
{
ReportsList.Items.Add(Path.GetFileNameWithoutExtension(file.Name));
报告列表.项目.排序说明.添加(sd);
}
}
如果(ReportsPrioritySelection.Text==“最新”)
{
ReportsList.Items.Clear();
SortDescription sd=新的SortDescription(“,ListSortDirection.Descending);
DirectoryInfo dinfo=新的DirectoryInfo(@“报告和修复\\报告\\\”);
FileInfo[]Files=dinfo.GetFiles(“*.xml”);
foreach(文件中的文件信息文件)
{
ReportsList.Items.Add(File.ReadAllText(@“Report&Fix\\ReportData\\Date\\”+Path.GetFileNameWithoutExtension(File.Name)+“.txt”)+“”+Path.GetFileNameWithoutExtension(File.Name));
报告列表.项目.排序说明.添加(sd);
}
}
}

您可以将列表绑定到项目集合,然后设置集合中的哪个属性应为显示属性,哪个属性应为“键”

  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";
}
var myItems=新列表()
{
新建SomeItem(){Id=1,Name=“File1.txt”},
新建SomeItem(){Id=2,Name=“File2.txt”},
新建SomeItem(){Id=3,Name=“File3.txt”}
};
ReportsList.DataSource=myItems;
ReportsList.DisplayMember=“Name”;
ReportsList.ValueMember=“Id”;
}
然后,在引用列表项时,可以执行
.ValueMember
以获取用于唯一引用的Id


所以,在您的例子中,不只是添加一个路径字符串,您应该创建一个具有两个属性的新对象,Id和path或其他任何属性,然后添加(因为
.add
接受一个对象)。然后告诉它要显示哪个属性,哪个是要查找的值。

我不知道从何处开始编写此代码,以及如何使每个报表文件都有一个“新的SomeItem”?关键是要更改
ReportsList.Items.Add(Path.getFileName WithOutExtension(file.Name))
ReportsList.Items.Add(new SomeItem(){Name=Path.GetFileNameWithoutExtension(file.Name),Id=);
。您需要创建一个名为
SomeItem
的类(给它一个更好的名称)。然后将这两个属性(displaymember和valuemember)设置为指向每个属性。或者按照上面的注释操作,并重写ToString方法以显示Name属性。最好不要添加字符串,而是添加您为此pupose创建的类。它应该具有ToString重写和所需的任意多个字段。然后,您可以将每个项强制转换到该类并访问你放在那里的所有信息..我想这就是Nibly在他的回答中的意思.对于这样一个最小的容器类。。