C# ListBox update on item change

14,409

Solution 1

Do the objects in the ListBox implement INotifyPropertyChanged?

Update:

It seems that you can solve the problem with a couple of steps:

  1. Set the DisplayMember property of the ListBox to a property on your objects that provides whatever it is you want to appear in the list. I will assume this property is named DisplayText for this answer.
  2. Have the objects implement INotifyPropertyChanged.
  3. In the setters of all the properties that influence the value of DisplayText, raise the NotifyPropertyChanged event with DisplayText for the property name.

You should then be good to go.

Solution 2

Following the tutorial I reference above I made a quick and dirty example of using a BindingList. Hopefully it's helpful to you.

public partial class Listbox_Databinding : Form
{
    BindingList<Person> People = new System.ComponentModel.BindingList<Person>();

    public Listbox_Databinding()
    {
        InitializeComponent();

        People.Add(new Person("John", "Smith"));
        People.Add(new Person("John", "Jacob"));

        lstSelectPerson.DataSource = People;

    }

    private void lstSelectPerson_SelectedIndexChanged(object sender, EventArgs e)
    {
        txtLast.Text = ((Person)lstSelectPerson.SelectedItem).Last;
    }

    private void btnUpdate_Click(object sender, EventArgs e)
    {
        ((Person)lstSelectPerson.SelectedItem).Last = txtLast.Text;
    }
}

public class Person : INotifyPropertyChanged
{
    public Person(string first, string last)
    {
        First = first;
        Last = last;
    }

    public override string ToString()
    {
        return Last + ", " + First;
    }

    string p_first;
    string p_last;

    public string First
    {
        get { return p_first; }
        set
        {
            p_first = value;
            OnDisplayPropertyChanged();
        }
    }

    public string Last
    {
        get { return p_last; }
        set
        {
            p_last = value;
            OnDisplayPropertyChanged();
        }
    }

    void OnDisplayPropertyChanged()
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("DisplayName"));
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}
Share:
14,409
Ozzah
Author by

Ozzah

Updated on July 31, 2022

Comments

  • Ozzah
    Ozzah almost 2 years

    I have a list of custom objects which I have added to a ListBox control in my WinForms C# 4.0 application.

    When the user selects a particular element in the ListBox, the properties of that object come up in the window next to the ListBox in various input fields. The user can change these and click 'Save' which will modify the data members of the objects to correspond with the changes the user has made.

    The function does work. The values are saved to the object, and when the user selects the element again, their changes are confirmed to be saved correctly.

    What isn't working is the update of the text in the ListBox. For example if we have a list of staff in the ListBox, and we can see "John Smith" there, we can click his name - edit his name to "John Smithe" and click OK. The ListBox still shows "John Smith", however if we click on his name, then in the TextBoxes on the right we can see that his name has correctly been changed to "John Smithe".

    I have tried calling the Refresh() method on the ListBox but this didn't work.

    I can fix it by removing the item from the ListBox and adding it again. This works, and it's not really an issue because the items are stored in separate lists anyway so I have no risk of losing any of my staff.

    But is this really the best way to do it? Is there a more elegant way to update the text in the ListBox without removing/adding the item again?