将一个 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));
}
这是它的工作原理:
我有这个型号:
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));
}
这是它的工作原理: