如何在 ListBox 中显示替代对象的表示?

How to display alternative object's representation inside ListBox?

前段时间我遇到了post,其中作者说如果我有一个ListBox,它里面的对象不必由返回的string表示ToString() ListBox

内部的方法

怎么可能?

例如我有一个:

 public class Car {
        public static int ID { get; set; }
        public int Id { get; set; }
        public string Make { get; set; }
        public int Power { get; set; }


        public Car(string Make, int Power) {
            Id = ID++;
            this.Make = Make;
            this.Power = Power;
            AddToClassExtension(this);
        }


        public override string ToString() {
            return Id + "." + Make + " " + Power;
        }
}

Form 中的 ListBox lb。我只想在 lb 的每一行中显示 car.Id 但不更改 ToString() 方法。可能吗?

您可以为 ListBox 指定 DisplayMember - 在这种情况下,您将其设置为 "Id" 以便控件从每个中获取 属性正在显示的项目。

这是一个简短但完整的示例(为简洁起见,使用 C# 6):

using System;
using System.Collections.Generic;
using System.Windows.Forms;

public class Car {
    // C# 6 finally allows read-only autoprops. Yay!
    public int Id { get; }
    public string Make { get; set; }

    public Car(int id, string make)
    {
        this.Id = id;
        this.Make = make;
    }

    public override string ToString() {
        return Id + "." + Make;
    }
}

class Test
{
    static void Main()
    {
        var cars = new List<Car>
        {
            new Car(10, "Ford"),
            new Car(20, "Nissan"),
            new Car(45, "Rolls-Royce")
        };

        var listBox = new ListBox
        {
            DataSource = cars,
            DisplayMember = "Id",
            Dock = DockStyle.Fill
        };

        var form = new Form
        { 
            Controls = { listBox }
        };
        Application.Run(form);
    }
}

对于更复杂的格式,您可以在启用格式后使用 Format 事件。例如,在上面的示例中,将 listBox 声明更改为:

var listBox = new ListBox
{
    DataSource = cars,
    Dock = DockStyle.Fill,
    FormattingEnabled = true,
};
listBox.Format += (sender, args) =>
{
    var car = (Car) args.Value;
    args.Value = string.Format("Id: {0}; Make: {1}", car.Id, car.Make);
};