你可以这样做:
- 使用两个 BindingSource 对象将列表中的每个 Car 链接到其列表
RacersNames
- 添加一个属性,用于在第一个列表框中显示每个汽车名称(
CarID
属性只是为了显示其用途ValueMember
)
- 当然,您需要公共属性。
BindingSource bsCars = null;
BindingSource bsRacers = null;
StartingField startingField = null;
public class Car
{
public Car(string carName, int carID) { CarName = carName; CarID = carID; }
public string CarName { get; }
public int CarID { get; }
public List<string> RacersNames { get; set; } = new List<string>();
}
public class StartingField
{
public List<Car> Cars { get; } = new List<Car>();
}
然后初始化数据源并设置BindingSource对象和ListBoxes的DataSource。
由于第二个 BindingSource 链接到RacersNames
第一个 BindingSource 的属性,当您在第一个 ListBox 中选择汽车名称时,第二个 BindingSource 将更新其内容,因此,绑定到它的 ListBox 将显示以下列表:RacersNames
与新的选择有关。
可以在两个列表中添加或删除元素。
您可以将此代码添加到Load
事件(或OnLoad()
覆盖)表单。
protected override void OnLoad(EventArgs e)
{
startingField = new StartingField();
var c1 = new Car("Car1", 1) { RacersNames = { "Racer1", "Racer2", "Racer3" } };
var c2 = new Car("Car2", 2) { RacersNames = { "Racer4", "Racer5", "Racer6" } };
var c3 = new Car("Car3", 3) { RacersNames = { "Racer7", "Racer8", "Racer9" } };
startingField.Cars.AddRange(new[] { c1, c2, c3});
bsCars = new BindingSource(startingField.Cars, "");
bsRacers = new BindingSource(bsCars, "RacersNames");
lstCars.DisplayMember = "CarName";
lstCars.ValueMember = "CarID";
lstCars.DataSource = bsCars;
lstRacers.DataSource = bsRacers;
}
添加或删除Car
对象,或从当前添加/删除元素RacersNames
列表,使用链接的 BindingSource。
您可以从基础 BindingList(内部创建的列表)添加/删除元素。
See the animation to determine what Buttons this code maps to
private void btnAddCar_Click(object sender, EventArgs e)
{
var newCar = startingField.Cars.Count + 1;
bsCars.Add(new Car($"Car{newCar}", newCar)
{
RacersNames = { "Racer10", "Racer11", "Racer12" }
});
}
private void btnAddRider_Click(object sender, EventArgs e)
{
bsRacers.Add("New Rider");
}
private void btnRemoveRider_Click(object sender, EventArgs e)
{
if (lstRacers.SelectedIndex < 0) return;
bsRacers.Remove(lstRacers.GetItemText(lstRacers.SelectedItem));
}
它是这样工作的: