Сначала привязка данных с помощью Winforms и EF 4.1 Code - PullRequest
2 голосов
/ 13 июля 2011

Я пытаюсь получить комбинированный список Winforms для автоматического обновления при записи новых строк в нашу базу данных.

Класс POCO EF:

public class BaseSweep 
{
    public int BaseSweepId { get; set; }
    //stuff removed for clarity
}

Я привязываюсь к даннымчерез BindingList следующим образом:

public BindingList<BaseSweep> TopSweeps()
{
    LocalDbContext.BaseSweep.Load();
    return LocalDbContext.BaseSweep.Local.ToBindingList();                     

}

private void BindSweepList() //called in Form_Load
{
    comboBoxSweepIds.DataSource = _dataAccess.TopSweeps();
    comboBoxSweepIds.DisplayMember = "BaseSweepId";
    comboBoxSweepIds.ValueMember = "BaseSweepId";
}

Это отлично работает для начальной привязки, показывает текущие идентификаторы в таблице.По мере добавления новых строк в таблицу число в LocalDbContext.BaseSweep.Local увеличивается, как и ожидалось.Однако comboBoxSweepIds никогда не обновляется.Есть идеи, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 14 июля 2011

Марк W указал мне правильный путь:

//put an event handler on the collection
public void CollectionChanged<T>(System.Collections.Specialized.NotifyCollectionChangedEventHandler eventHandler) where T : class
{
     LocalDbContext.Set<T>().Local.CollectionChanged += eventHandler;
}

Использование личного BindingList<T> в классе формы (_sweepCollection)

В первом привязке данных настройте событиеобработчик:

private void BindSweepList()
{            
    _sweepCollection = _dataAccess.TopSweeps();
    _dataAccess.CollectionChanged<CableSweepDebug>(new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Local_CollectionChanged));

    UpdateSweepsData();
}

private void Local_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
     UpdateSweepsData();
}

private void UpdateSweepsData()
{
    if (comboBoxSweepIds.InvokeRequired)
    {
        Invoke(new UpdateSweepCount(UpdateSweepsData));
    }
    else
    {
        var tmpBind = _sweepCollection.OrderByDescending(t => t.BaseSweepId).Take(100);

        comboBoxSweepIds.DataSource = null;
        comboBoxSweepIds.DataSource = tmpBind.ToList() ;
        comboBoxSweepIds.DisplayMember = "BaseSweepId";
        comboBoxSweepIds.ValueMember = "BaseSweepId";                

    }
}
0 голосов
/ 13 июля 2011

Вам нужно запускать событие и вызывать привязку каждый раз, когда добавляется строка.

...