Manu Prasad Ответов: 1

Небольшая сложная привязка данных в ComboBox windows form


У меня возникли проблемы во время работы над привязкой данных в windows form. У меня есть два класса, один-проект, а другой-обновление. Теперь весь объект проекта имеет список обновлений и привязан к выпадающему списку, но при изменении пользователем выбора необходимо отобразить/привязать свойства объекта обновления к другим элементам управления. Но не обновляется, как ожидалось, когда пользователь изменяет выбор. Пожалуйста, помогите мне в этом.

Что я уже пробовал:

public class Project
{
    private int _id;
    private string _name;

    public Project(int id, string name)
    {
        _id = id;
        _name = name;

        ReadUpdates();
    }

    public List<Update> AvailableUpdates { get; set; }
    public int Id { get { return _id; } }

    public string ProjName
    {
        get { return _name; }
        set { _name = value; }
    }

    private void ReadUpdates()
    {
        AvailableUpdates = new List<Update>();

        for (int i = 0; i < 10; i++)
        {
            AvailableUpdates.Add(new
                Update(i, DateTime.Now.AddDays(i)));
        }
    }
}

public class Update
{
    private string _title;
    private int _uid;
    private DateTime _updatedOn;

    public Update(int id, DateTime updatedOn)
    {
        _title = $"Update:{id}";
        _uid = id;
        _updatedOn = updatedOn;
    }

    public string Title
    {
        get { return _title; }
        set { _title = value; }
    }

    public int UId
    {
        get { return _uid; }
        set { _uid = value; }
    }

    public DateTime UpdatedOn
    {
        get { return _updatedOn; }
        set { _updatedOn = value; }
    }
}

public partial class Form1 : Form
{
    private Update _currentUpdate;
    private Project _project;

    public Form1()
    {
        InitializeComponent();

        _project = new Project(1, "Sample Project");

        DoBindings();
    }

    private void DoBindings()
    {
        NameBox.DataBindings.Add("Text", _project, "ProjName");
        IdBox.DataBindings.Add("Text", _project, "Id");

        UpdatesCombo.DataSource = _project.AvailableUpdates;
        UpdatesCombo.DisplayMember = "UId";

        _currentUpdate = (Update)UpdatesCombo.SelectedItem;

        UpdateTitle.DataBindings.Add("Text", _currentUpdate, "Title");
        UpdateDate.DataBindings.Add("Value", _currentUpdate, "UpdatedOn");
    }

    private void UpdatesCombo_SelectionChangeCommitted(object sender, System.EventArgs e)
    {
        _currentUpdate = (Update)UpdatesCombo.SelectedItem;
    }
}

1 Ответов

Рейтинг:
0

FranzBe

используйте BindingList<t> Вместо List<t> и BindingSource, и он будет работать по желанию

using System.ComponentModel;

public partial class Form1 : Form
  {
    private Update _currentUpdate;
    private Project _project;
    private BindingSource bs;
    ...
    private void DoBindings()
    {
      NameBox.DataBindings.Add("Text", _project, "ProjName");
      IdBox.DataBindings.Add("Text", _project, "Id");

      bs = new BindingSource();
      bs.DataSource = _project.AvailableUpdates;
      UpdatesCombo.DataSource = bs;
      UpdatesCombo.DisplayMember = "UId";
      UpdatesCombo.ValueMember = "UId";

      _currentUpdate = (Update)UpdatesCombo.SelectedItem;

      UpdateTitle.DataBindings.Add("Text", bs, "Title");
      UpdateDate.DataBindings.Add("Value", bs, "UpdatedOn");
    }

  }


  public class Project 
  {
     //...
     public BindingList<Update> AvailableUpdates { get; set; }

  }

  //...
  private void ReadUpdates()
      {
        AvailableUpdates = new BindingList<Update>();

        for (int i = 0; i < 10; i++)
        {
          AvailableUpdates.Add(new
              Update(i, DateTime.Now.AddDays(i)));
        }
      }


более подробный ответ на довольно похожий вопрос вы найдете здесь:
c# - ComboBox не обновит свой список отображения, если вы не измените выбор первым - переполнение стека[^]