C # ListBox обновление при изменении элемента - PullRequest
3 голосов
/ 14 марта 2011

У меня есть список пользовательских объектов, которые я добавил в элемент управления ListBox в моем приложении WinForms C # 4.0.

Когда пользователь выбирает определенный элемент в ListBox, свойства этого объекта появляются вокно рядом с ListBox в различных полях ввода.Пользователь может изменить их и нажать «Сохранить», чтобы изменить элементы данных объектов в соответствии с изменениями, внесенными пользователем.

Функция работает.Значения сохраняются в объекте, и когда пользователь снова выбирает элемент, подтверждается, что их изменения сохранены правильно.

Что не работает, так это обновление текста в ListBox.Например, если у нас есть список сотрудников в ListBox, и мы можем видеть там «Джона Смита», мы можем щелкнуть его имя - изменить его имя на «Джон Смит» и нажать «ОК».В ListBox по-прежнему отображается «Джон Смит», однако, если мы щелкнем по его имени, то в текстовых полях справа мы увидим, что его имя было правильно изменено на «Джон Смит».

Я попытался позвонитьметод Refresh () в ListBox, но это не сработало.

Я могу это исправить, удалив элемент из ListBox и добавив его снова.Это работает, и это на самом деле не проблема, потому что элементы хранятся в отдельных списках в любом случае, поэтому я не рискую потерять кого-либо из своих сотрудников.

Но действительно ли это лучший способ сделать это?Есть ли более элегантный способ обновить текст в ListBox, не удаляя и не добавляя элемент снова?

Ответы [ 2 ]

3 голосов
/ 14 марта 2011

Следуя уроку, на который я ссылаюсь выше, я сделал быстрый и грязный пример использования BindingList.Надеюсь, это поможет вам.

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
}
3 голосов
/ 14 марта 2011

Имеются ли в ListBox объекты INotifyPropertyChanged?

Обновление:

Похоже, вы можете решить проблему с помощью пары шагов:

  1. Установите свойство DisplayMember ListBox для свойства ваших объектов, которое предоставляет все, что вы хотите, чтобы появиться в списке. Я предполагаю, что это свойство называется DisplayText для этого ответа.
  2. Пусть объекты реализуют INotifyPropertyChanged.
  3. В установщиках всех свойств, которые влияют на значение DisplayText, увеличьте событие NotifyPropertyChanged с DisplayText для имени свойства.

Тогда тебе следует идти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...