> In the collection class, I am overriding the OnInsertComplete
> method and raising the ListChanged event, with proper args.
You should raise the events yourself.
Like:
public object AddNew()
{
object obj =
Activator.CreateInstance(this._containedType);
BEBase be = (BEBase)obj;
List.Add(be);
return obj;
}
You've to raise the event after teh Add. As you can see with reflector,
OnInsertComplete isn't called when you ADD a method.
(CollectionBase contains an ArrayList internally).
The code looks familiar though ;)
http://weblogs.asp.net/fbouma/articles/115837.aspx
Frans
>
> Although, the entire code was not required still I removed
> certain not required methods and am posting the code. I have
> created custom objects for holding the data and the fields
> are marked with custom attributes. Code goes her.....
>
> using System;
> using System.Collections;
> using System.ComponentModel;
> using System.Runtime.Remoting;
>
> namespace BusinessEntity
> {
> public abstract class BECollection : CollectionBase,
> ITypedList, IBindingList
> {
> protected Type _containedType;
>
> public BECollection( Type t )
> {
> this._containedType = t;
> }
>
> virtual internal int Add( BEBase obj )
> {
> return this.InnerList.Add(obj);
> }
>
> virtual internal void Remove( BEBase obj )
> {
> this.InnerList.Remove(obj);
> }
>
> public BEBase this[int index]
> {
> get
> {
> return InnerList[index];
> }
> set
> {
> List[index] = value;
> }
> }
>
> PropertyDescriptorCollection
> ITypedList.GetItemProperties( PropertyDescriptor[] listAccessors )
> {
> Type typeOfObject = null;
>
> if( (listAccessors==null) ||
> listAccessors.Length==0 )
> {
> typeOfObject = _containedType;
> }
> return this.GetPropertyDescriptors(
> typeOfObject );
> }
>
> string
> ITypedList.GetListName(PropertyDescriptor[] listAccessors)
> {
> return "Learning..";
> }
>
> private PropertyDescriptorCollection
> GetPropertyDescriptors( Type typeOfObject )
> {
> PropertyDescriptorCollection
> typePropertiesCollection = TypeDescriptor.GetProperties(
> typeOfObject );
> ArrayList propertyDescriptorsToUse =
> new ArrayList();
>
> foreach(PropertyDescriptor property
> in typePropertiesCollection)
> {
> BEFieldAttribute befieldAttribute =
>
> (BEFieldAttribute)property.Attributes[typeof(BEFieldAttribute)];
>
> if (befieldAttribute != null)
> {
> // add it, as it has
> the attribute applied to it
>
> propertyDescriptorsToUse.Add(property);
> }
> }
> return new
> PropertyDescriptorCollection((PropertyDescriptor[])propertyDes
criptorsToUse.ToArray(typeof(PropertyDescriptor)));
> }
>
> public void AddIndex(PropertyDescriptor property)
> {
> throw new NotSupportedException();
> }
>
> public bool AllowNew
> {
> get
> {
> return true;
> }
> }
>
> public void ApplySort(PropertyDescriptor
> property, System.ComponentModel.ListSortDirection direction)
> {
> throw new NotSupportedException();
> }
>
> public PropertyDescriptor SortProperty
> {
> get
> {
> throw new NotSupportedException();
> }
> }
>
> public int Find(PropertyDescriptor property,
> object key)
> {
> throw new NotSupportedException();
> }
>
> public bool SupportsSorting
> {
> get
> {
> return false;
> }
> }
>
> public bool IsSorted
> {
> get
> {
> throw new NotSupportedException();
> }
> }
>
> public bool AllowRemove
> {
> get
> {
> return true;
> }
> }
>
> public bool SupportsSearching
> {
> get
> {
> return false;
> }
> }
>
> public
> System.ComponentModel.ListSortDirection SortDirection
> {
> get
> {
> throw new NotSupportedException();
> }
> }
>
> public event
> System.ComponentModel.ListChangedEventHandler ListChanged;
>
> public bool SupportsChangeNotification
> {
> get
> {
> return true;
> }
> }
>
> public void RemoveSort()
> {
> throw new NotSupportedException();
> }
>
> public object AddNew()
> {
> object obj =
> Activator.CreateInstance(this._containedType);
> BEBase be = (BEBase)obj;
>
> List.Add(be);
>
> return obj;
> }
>
> public bool AllowEdit
> {
> get
> {
> return true;
> }
> }
>
> public void RemoveIndex(PropertyDescriptor property)
> {
> throw new NotSupportedException();
> }
>
> protected override void OnInsertComplete(int
> index, object value)
> {
> ListChanged(this, new
> ListChangedEventArgs(ListChangedType.ItemAdded,
> index));
> }
> }
> }
>
>
> Thanks
>
> Regards,
> Girish Jain
>
>
>
>
> >From: Frans Bouma <[EMAIL PROTECTED]>
> >Reply-To: "Discussion of advanced .NET topics."
> ><[email protected]>
> >To: [email protected]
> >Subject: Re: [ADVANCED-DOTNET] CurrencyManager and Data Binding
> >Date: Fri, 2 Jun 2006 12:31:14 +0200
> >
> > > I have created a custom collection class which inherits from
> > > CollectionBase class and implements the IBindingList
> interface. I am
> > > having a problem regarding adding a new record and form binding.
> > > When I add a new record by calling the AddNew() method on the
> > > CurrencyManager class instance, the screen does not get
> refreshed.
> > > When I tried to figure out the problem, I found that the
> position of
> > > the CurrnecyManager does not change, and it does not fire the
> > > PositionChanged event. I figured that the
> > > CurrnecyManager.AddNew() method calls the
> > > IBindingList.AddNew() and it internally calls the
> > > ChangeRecordState() method. By looking at the call stack,
> I see that
> > > the newPosition argument passed to
> > > ChangeRecordState() method is correct and it raises the
> > > CurrentChanged event whereas the PositionChanged event
> does not get
> > > fired and the UI is not updated.
> > >
> > > When I move the record position by incrementing or
> decrementing the
> > > Positon property, the UI controls does get updated
> normally but not
> > > in the case of
> > > AddNew() i.e.
> > >
> > > _cm.Position = _cm.Count-1;
> > >
> > > also does not work
> > >
> > > Your inputs on this would be highly appreciated
> >
> > You should raise ListChanged events in your class.
> You should
> >pass the index of the item changed/ added/ removed as well
> as the type
> >of the change in the eventargs.
> >
> > Frans
> >
> >===================================
> >This list is hosted by DevelopMentorR http://www.develop.com
> >
> >View archives and manage your subscription(s) at
> >http://discuss.develop.com
>
> ===================================
> This list is hosted by DevelopMentorR http://www.develop.com
>
> View archives and manage your subscription(s) at
> http://discuss.develop.com
>
===================================
This list is hosted by DevelopMentorĀ® http://www.develop.com
View archives and manage your subscription(s) at http://discuss.develop.com