CRUD on BindingSource in Winforms

本文关键字:Winforms in BindingSource on CRUD | 更新日期: 2023-09-27 18:25:10

我有一个DataGridView和一个使用bs.DataSource = list;填充的BindingSource bs,其中listBindingList<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;
}

CRUD on BindingSource in Winforms

您需要在BindingList<Item>BindingSource bs上侦听ListChanged事件。在ListChangedEventArgs中,具有的ListChangedType有关于更改内容的特定细节:

重置-列表的大部分内容都已更改。任何监听控件都应该刷新列表中的所有数据。

ItemAdded-添加到列表NewIndex包含已添加项的索引。

项目已删除-从列表中删除的项目。NewIndex包含已删除项目的索引。

ItemMoved-在中移动的项目列表。OldIndex包含项目的上一个索引,而NewIndex包含项目的新索引。

项目更改-项目已在列表中更改。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时,您应该获得更新。然后,当您收到这些事件或通过数据绑定时,您可以更改项目的状态。

您可以在BindingSource 上侦听CurrentItemChange事件

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