CRUD на BindingSource в Winforms - PullRequest
       0

CRUD на BindingSource в Winforms

0 голосов
/ 21 февраля 2012

У меня есть DataGridView и BindingSource bs, заполненные с помощью bs.DataSource = list;, где list - это BindingList<Item>.

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

Редактировать :

public abstract class Item : INotifyPropertyChanged { .......
public Item()
{
    Id = IdCounter++;
    Pairs = new HashSet<int>();
    State = ItemState.NEW;
    Name = "#noname";
    Note = "";
    PropertyChanged += new PropertyChangedEventHandler(Item_PropertyChanged);
}

void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    SetChanged();
}

/* nastaví příznak, že se něco změnilo - to následně vyvolá UPDATE (při použití SQL úložiště) */
public void SetChanged()
{
    State = ItemState.CHANGED;
}

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Вы хотите прослушать событие ListChanged на вашем BindingList<Item> или BindingSource bsListChangedEventArgs ListChangedType с конкретными сведениями о том, что изменилось:

Сброс - большая часть списка изменилась.Любые элементы управления прослушиванием должны обновить все свои данные из списка.

ItemAdded - Элемент добавлен в список.NewIndex содержит индекс добавленного элемента.

ItemDeleted - элемент удален из списка.NewIndex содержит индекс элемента, который был удален.

ItemMoved - элемент, перемещенный в списке.OldIndex содержит предыдущий индекс для элемента, тогда как NewIndex содержит новый индекс для элемента.

ItemChanged - элемент, измененный в списке.NewIndex содержит индекс элемента, который был изменен.

Я выделил те, что вы упомянули.

Обновление

Хорошо, так что этоВот как должен выглядеть класс Item:

public class Item : INotifyPropertyChanged
{
   public event PropertyChangedEventHandler PropertyChanged;

   private int _Id;
   private HashSet<int> _Pairs;
   private ItemState _State;
   private String _ItemName;
   private String _Note;

   public Item()
   {
      Id = IdCounter++;
      Pairs = new HashSet<int>();
      State = ItemState.NEW;
      Name = "#noname";
      Note = "";      
   }

   public int Id
   {
      get { return _Id; }
      set
      {
         if(_Id != value)
         {
            _Id = value;
            NotifyPropertyChanged("Id");
         }
      }
   }

   ... Implement other properties like above/below

   // Dont use 'Name' as a property type
   public String ItemName
   {
      get { return _ItemName; }
      set
      {
         if(_ItemName!= value)
         {
            _ItemName= value;
            NotifyPropertyChanged("ItemName");
         }
      }
   }

   ...

   public void NotifyPropertyChanged(String propertyName)
   {
      PropertyChangedEventHandler prop_changed = PropertyChanged;
      if (prop_changed != null)
      {
         prop_changed(this, new PropertyChangedEventArgs(propertyName));
      }
   }
}

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

0 голосов
/ 21 февраля 2012

Существует событие CurrentItemChange, которое вы можете прослушивать на BindingSource

http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx

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