如何使用C#列出列表框中的类对象?

时间:2011-04-27 21:46:53

标签: 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, 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>();

我想要归档的是将列表中的所有对象加载到列表框中。 到目前为止它确实是它的工作,但它只是将对象名称写入如下所示的列表enter image description here

而不是实际地址。

如何让它显示让我们说数字+位置+街道+城市而不是对象名称?

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

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

再次非常感谢

4 个答案:

答案 0 :(得分:8)

有几个选项,

  • 覆盖ToString(),但这在任何地方都有效。也许有用。
  • 插入格式化字符串,然后按索引
  • 找回对象
  • 使用DataSource,DisplayMember和ValueMember - 您需要一个用于数字+位置+街道+城市的伪属性,并将其用作显示成员
  • 处理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);
}

答案 1 :(得分:0)

ListControl.DisplayMember是您要查找的属性。

listBox1.DataSource = routeStops;
listBox1.DisplayMember = "location";
listBox1.ValueMember = "number";

如果你想显示整个地址,我会创建一个名为displayAddress的readonly属性或者你想要显示的格式。

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

答案 2 :(得分:0)

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

我不知道你的代码是什么,它会将项目添加到列表框中,但这里有一个可能对你有用的信息:

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

答案 3 :(得分:0)

如果您要设置listBox DataSource,请将DataMember设置为RouteStop的任何属性,它将会显示。

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