【问题标题】:How to list class objects in listbox using C#?如何使用 C# 在列表框中列出类对象?
【发布时间】:2011-04-27 21:46:52
【问题描述】:

我有一个自定义类

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

我要归档的是将列表中的所有对象加载到列表框中。 到目前为止,它已经完成了它的工作,但它只是将对象名称写入列表中,而不是实际地址,如下所示

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

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

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

再次感谢你

【问题讨论】:

    标签: c# winforms listbox


    【解决方案1】:

    有几种选择,

    • 覆盖 ToString(),但这对任何地方都有影响。也许有用。
    • 插入格式化字符串,然后按索引找回对象
    • 使用 DataSource、DisplayMember 和 ValueMember - 您需要一个数字 + 位置 + 街道 + 城市的伪属性,并将其用作 Displaymember
    • 处理 ListBox Format 事件

    最后一个可能是最实用的。 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);
    }
    

    【讨论】:

    • 因此,如果我使用列表框更改了某些内容,则应该在列表本身中进行更改,因为它们是绑定的。对吗?
    • @jm2,是的。最多你需要一个 ListBox.Invalidate()。大多数其他选项都需要重新绑定或重新填充。
    • 好的。关于我的另一个问题。当我选择一个项目时,我得到了由覆盖的 ToString 方法输出的完整地址。如何再次访问选定的对象?
    • 不,SelectedItem 应该是 RouteStop。
    • 它以某种方式输出地址(来自 ToString 方法)而不是对象本身。双重检查
    【解决方案2】:

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

    我不知道您将项目添加到列表框中的代码是什么样的,但这里有一个可能对您有所帮助的代码段:

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

    【讨论】:

    • 这将用字符串填充 ListBox - 很难找到选定的 RouteStop。
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢 :) 覆盖 ToString 方法现在根据需要显示完整地址。
    【解决方案4】:

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

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

    如果您想显示整个地址,我将创建一个名为 displayAddress 的只读属性或您希望显示的格式。

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

    【讨论】:

    • 这只会显示位置,而不是number + location + street + city
    • 这就是为什么我提到创建一个显示属性,该属性将具有您想要的格式的值,然后将 DisplayMember 绑定到该属性。
    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2017-12-02
    • 2020-02-15
    • 2015-09-25
    相关资源
    最近更新 更多