Hi,
Seems you need to add other code to keep the selected index of Passengers bindinglist when plane bindinglist changed.
Keep the selectedIndex when Planes listChanged. Then reset the selectedIndex in ListPassenger SelectedIndexChanged event.
Besides, planes.ListChanged event must be registered before being bound to listbox. This will make the bindinglist.listchanged event be triggered before listbox.selectedIndexChanged event.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
BindingList<Plane> planes = new BindingList<Plane>();
BindingList<Plane> planes1 = new BindingList<Plane>();
BindingList<Passenger> Passengers = new BindingList<Passenger>();
Passengers.Add(new Passenger("cc", 1));
Passengers.Add(new Passenger("cc", 12));
Passengers.Add(new Passenger("cc", 13));
Passengers.Add(new Passenger("cc", 14));
BindingList<Passenger> Passengers1 = new BindingList<Passenger>();
Passengers1.Add(new Passenger("aa", 1));
Passengers1.Add(new Passenger("aa", 12));
Passengers1.Add(new Passenger("aa", 13));
Passengers1.Add(new Passenger("aa", 14));
planes.Add(new Plane("test", Passengers));
planes.Add(new Plane("test", Passengers1));
planes.ListChanged += new ListChangedEventHandler(planes_ListChanged);
listPlanes.DataSource = planes;
listPlanes.DisplayMember = "PlaneName";
txtPlaneName.DataBindings.Add("Text", planes, "PlaneName", false, DataSourceUpdateMode.OnPropertyChanged);
listPassenger.DataSource = planes;
listPassenger.DisplayMember = "Passengers.Name";
txtAge.DataBindings.Add("Text", planes, "Passengers.Age", false, DataSourceUpdateMode.OnPropertyChanged);
txtName.DataBindings.Add("Text", planes, "Passengers.Name", false, DataSourceUpdateMode.OnPropertyChanged);
listPassenger.SelectedIndexChanged += new EventHandler(listPassenger_SelectedIndexChanged);
}
bool changed = false;
int index = 0;
void planes_ListChanged(object sender, ListChangedEventArgs e)
{
changed = true;
index = listPassenger.SelectedIndex;
}
void listPassenger_SelectedIndexChanged(object sender, EventArgs e)
{
if (changed == true && index != 0)
{
listPassenger.SelectedIndex = index;
changed = false;
index = 0;
}
}
}
public class Plane : INotifyPropertyChanged
{
private string _PlaneName;
private BindingList<Passenger> _Passengers;
public Plane(string strPlaneName, BindingList<Passenger> ListPassengers)
{
this._PlaneName = strPlaneName;
this._Passengers = ListPassengers;
}
public string PlaneName
{
get
{
return _PlaneName;
}
set
{
_PlaneName = value; onpropertychanged("PlaneName");
}
}
public BindingList<Passenger> Passengers
{
get
{
return _Passengers;
}
set
{
_Passengers = value; onpropertychanged("Passengers");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void onpropertychanged(string pn)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(pn));
}
}
#endregion
}
public class Passenger : INotifyPropertyChanged
{
private string _Name;
private int _Age;
public Passenger(string strName, int iAge)
{
this._Name = strName;
this._Age = iAge;
}
public string Name
{
get
{
return _Name;
}
set
{
_Name = value; onpropertychanged("Name");
}
}
public int Age
{
get
{
return _Age;
}
set
{
_Age = value; onpropertychanged("Age");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void onpropertychanged(string pn)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(pn));
}
}
#endregion
}
Best regards,
Ling Wang
Please remember to click “Mark as Answer�on the post that helps you, and to click “Unmark as Answer�if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.