将一个 ListBox 的 SelectedItem 绑定到另一个 ListBox

Bind the SelectedItem of a ListBox to another ListBox

我有这个型号:

class Car
{
  string CrewNickname { get; set; }
  Líst<string> RacersNames { get; set; }
}

class StartingField
{
  List<Car> Cars { get; set; }
}

我需要的是在一个 ListBox 中显示汽车,当我单击任何汽车时,在第二个 ListBox 中显示其赛车手的名字。
我还需要能够 add/remove 汽车和 add/remove/编辑赛车手。

我还没有找到任何合适的教程或问题,但我认为这一定是可以创建的。

您应该对引发 SelectedValueChanged 事件的第一个列表框使用 OnSelectedIndex 方法。然后根据第一个列表框的选定索引填充第二个列表框。

你可以这样做:

  • 使用两个 BindingSource 对象 link 列表中的每个 Car 到它的列表 RacersNames
  • 在第一个ListBox中添加一个属性用于显示每个Car名称(CarID 属性只是为了显示ValueMember的使用)
  • 你当然需要public属性。

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 linked 到第一个 BindingSource 的 RacersNames 属性,当您 select 第一个 ListBox 中的汽车名称时,第二个 BindingSource 将更新其内容因此,绑定到它的 ListBox 将显示与新 selection.

相关的 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;
}

要在当前 RacersNames 列表中添加或删除 Car 个对象或 add/remove 个元素,请使用 linked BindingSources。
您可以 add/remove 来自基础 BindingList(内部创建的列表)的元素。

查看动画以确定此代码映射到哪些按钮

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

这是它的工作原理: