如何在 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);
};
前段时间我遇到了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);
};