ListCollectionView BindingSource Refresh

1.1k views Asked by At

I am binding ListCollectionView to BindingSource which in turn is binded to DataGridView (winforms). But Whenever new object is added to ListCollectionView BindingSource is not getting updated automatically. I need to make it NULL and re-bind again.

//Binding to Datagrid
bindingProvider.DataSource = this.GetController.ProvidersView;
this.dgvProviders.DataSource = bindingProvider;

After that in Add Button Click.

//Adds new object in ProvidersView Collection.
this.GetController.AddEditProvider();
this.bindingProvider.DataSource = null;
this.bindingProvider.DataSource = this.GetController.ProvidersView;

Can someone please let me know the easy way of refreshing the Bindingsource.

Below is the sample code

BindingList<DemoCustomer> lstCust = new BindingList<DemoCustomer>();
        BindingListCollectionView view;
private void Form1_Load(object sender, EventArgs e)
        {
            lstCust.Add(DemoCustomer.CreateNewCustomer());
            lstCust.Add(DemoCustomer.CreateNewCustomer());
            lstCust.Add(DemoCustomer.CreateNewCustomer());
            lstCust.Add(DemoCustomer.CreateNewCustomer());

            view = new BindingListCollectionView(lstCust);

            bindingSource1.DataSource = view;

            dataGridView1.DataSource = bindingSource1;
        }

private void button1_Click(object sender, EventArgs e)
        {
            this.lstCust.Add(DemoCustomer.CreateNewCustomer());
            bindingSource1.EndEdit();
            this.bindingSource1.ResetBindings(false);
            //(bindingSource1.DataSource as BindingListCollectionView).NeedsRefresh
            dataGridView1.Refresh();
        }

public class DemoCustomer : INotifyPropertyChanged
    {
        // These fields hold the values for the public properties. 
        private Guid idValue = Guid.NewGuid();
        private string customerNameValue = String.Empty;
        private string phoneNumberValue = String.Empty;

        public event PropertyChangedEventHandler PropertyChanged;

        // This method is called by the Set accessor of each property. 
        // The CallerMemberName attribute that is applied to the optional propertyName 
        // parameter causes the property name of the caller to be substituted as an argument. 
        private void NotifyPropertyChanged(string propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        // The constructor is private to enforce the factory pattern. 
        private DemoCustomer()
        {
            customerNameValue = "Customer";
            phoneNumberValue = "(312)555-0100";
        }

        // This is the public factory method. 
        public static DemoCustomer CreateNewCustomer()
        {
            return new DemoCustomer();
        }

        // This property represents an ID, suitable 
        // for use as a primary key in a database. 
        public Guid ID
        {
            get
            {
                return this.idValue;
            }
        }

        public string CustomerName
        {
            get
            {
                return this.customerNameValue;
            }

            set
            {
                if (value != this.customerNameValue)
                {
                    this.customerNameValue = value;
                    NotifyPropertyChanged("CustomerName");
                }
            }
        }

        public string PhoneNumber
        {
            get
            {
                return this.phoneNumberValue;
            }

            set
            {
                if (value != this.phoneNumberValue)
                {
                    this.phoneNumberValue = value;
                    NotifyPropertyChanged("PhoneNumber");
                }
            }
        }
    }

Please let me know whats the issue with my code. Whenever I add any new item its not reflected in BindingSource bcoz of tht its not reflecting in DataGridView

www.techknackblogs.com

1

There are 1 answers

1
Reed Copsey On

Make sure your underlying collection (that you used to create the CollectionView) implements INotifyCollectionChanged.

For example, instead of using a List<T>, use ObservableCollection<T> or BindingList<T>.

This allows changes to the collection (adding an element) to propagate to the CollectionView.