如何使用C#在listbox中列出类对象?

如何使用C#在listbox中列出类对象?,c#,winforms,listbox,C#,Winforms,Listbox,我有一个自定义类 class RouteStop { public int number; public string location; public string street; public string city; public string state; public string zip; public RouteStop(int INnumber, string INlocation, string INstreet, st

我有一个自定义类

class RouteStop
{
    public int number;
    public string location;
    public string street;
    public string city;
    public string state;
    public string zip;

    public RouteStop(int INnumber, string INlocation, string INstreet, string INcity, string INstate, string INzip)
    {
        this.number = INnumber;
        this.location = INlocation;
        this.street = INstreet;
        this.city = INcity;
        this.state = INstate;
        this.zip = INzip;
    }
}
然后我有一个存储RouteStop项的列表

private List<RouteStop> routeStops = new List<RouteStop>();
private List routeStops=new List();
我试图归档的是将列表中的所有对象加载到列表框中。 到目前为止,它完成了它的工作,但它只是将对象名写入如下所示的列表,而不是实际地址

我怎样才能让它显示,比如说数字+位置+街道+城市,而不是对象名称

在将来,我还需要添加OnSelect事件来打开一个新窗口来编辑每个对象的数据。我如何传递有关所选项目的信息

添加: 非常感谢大家。每个答案都有帮助。所以到目前为止,我所做的是将数据源更改为列表,重写ToString方法以在列表中显示完整地址,使用唯一id将新项添加到RouteStop,并将DisplayMember设置为uniqe id,以便我将来也可以通过id访问所选项


再次非常感谢您

ListControl.DisplayMember是您正在寻找的财产

listBox1.DataSource = routeStops;
listBox1.DisplayMember = "location";
listBox1.ValueMember = "number";
如果您想显示整个地址,我会创建一个名为displayAddress的只读属性,或者您希望显示的格式


关于你的第二个问题。Items集合将包含您的实际对象,因此您可以使用SelectedItem检索它们,或者您可以使用SelectedValue并从返回的number属性值创建一个新对象。

在WinForms中将新ListItem添加到列表框时,您必须传入一个要显示的字符串。它将允许您传入一个对象(即.net framework中的任何自定义或内置类型),但在这种情况下,在幕后,它将简单地调用对象上的object.ToString方法以获取用于显示的文本

我不知道将项目添加到列表框的代码是什么样子的,但下面是一个可能对您有所帮助的小技巧:

foreach (RouteStop stop in routeStops) {
    listBox.Items.Add("{0} {1} {2} {3}", stop.number, stop.location, stop.street, stop.city);
}

如果要设置
列表框
数据源
,请将
DataMember
设置为
RouteStop
的任何属性,然后将显示该属性


如果没有,则重写
ToString()
(返回的任何字符串都将显示),并且不要忘记设置
listBox1.FormattingEnabled=false

有几个选项

  • 重写ToString(),但这在任何地方都有效。也许有用
  • 插入格式化字符串,然后按索引查找对象
  • 使用DataSource、DisplayMember和ValueMember-您将需要number+location+street+city的伪属性,并将其用作DisplayMember
  • 处理ListBox格式事件
最后一个可能是最实际的。ListBox.Items仍然是RouteStops,您可以随意创建字符串

Format事件的内部结构如下所示:

RouteStop rs = e.Item as RouteStop;
string s = ... // use rs to create a nice string 
e.Value = s;
要在以后的“双击”事件中使用它,只需执行此操作,其中url只是RouteStop的一个属性

private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
    Process.Start("iexplore.exe",((RouteStop)listBox1.SelectedItem).url);
}

这将用字符串填充列表框-很难找到所选的RouteStop。这将只显示位置,而不是
number+location+street+city
,这就是为什么我提到创建一个显示属性,该属性的值将采用您想要的格式,然后将DisplayMember绑定到它。谢谢:)覆盖ToString方法现在会根据需要显示完整地址。因此,如果我使用listbox内容更改了某些内容,则应该在列表中更改,因为它们已绑定。对吗?@jm2,对。最多需要一个ListBox.Invalidate()。大多数其他选项都需要重新绑定或重新填充。好的。关于我的另一个问题。当我选择一个项目时,我得到了由Overwritedtostring方法输出的完整地址。如何再次访问所选对象?不,SelectedItem应该是RouteStop。它以某种方式输出地址(从ToString方法),而不是对象本身。复核