By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,395 Members | 2,505 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,395 IT Pros & Developers. It's quick & easy.

[Q]IBindingList interface problem.

P: n/a
I met a problem when implementing IBindingList interface.

I made CustomerList class, copied from MSDN, to implement CollectionBase and
IBindingList.
My problem took place after setting Datasource and adding new data.

The system throw the following exception when I run "button1_Click",
A first chance exception of type 'System.ArgumentOutOfRangeException'
occurred in system.windows.forms.dll
Additional information: Specified argument was out of the range of valid
values.

Why does this exception take place?
and How to handle it?

/*
Test Form
*/
private System.Windows.Forms.ListBox listBox1;
private CustomersList list = new CustomersList();

public TestForm()
{
InitializeComponent();

this.listBox1.DataSource = list;
}

private void button1_Click(object sender, System.EventArgs e)
{
Customer a = new Customer("aaa");
Customer b = new Customer("bbb");
list.Add(a); // Exception
list.Add(b);
}

/*
Customer and CustomerList Class
*/

public class Customer
{
public string FirstName = "";
public string LastName = "";
public string Tel = "";
public object Parent;
public Customer(string tel)
{
Tel = tel;
}

}

public class CustomersList : CollectionBase, IBindingList
{

private ListChangedEventArgs resetEvent = new
ListChangedEventArgs(ListChangedType.Reset, -1);
private ListChangedEventHandler onListChanged;

public void LoadCustomers()
{
IList l = (IList)this;
l.Add(ReadCustomer1());
l.Add(ReadCustomer2());
OnListChanged(resetEvent);
}

public Customer this[int index]
{
get
{
return (Customer)(List[index]);
}
set
{
List[index] = value;
}
}

public int Add (Customer value)
{
return List.Add(value);
}

public Customer AddNew()
{
return (Customer)((IBindingList)this).AddNew();
}

public void Remove (Customer value)
{
List.Remove(value);
}
protected virtual void OnListChanged(ListChangedEventArgs ev)
{
if (onListChanged != null)
{
onListChanged(this, ev);
}
}
protected override void OnClear()
{
foreach (Customer c in List)
{
c.Parent = null;
}
}

protected override void OnClearComplete()
{
OnListChanged(resetEvent);
}

protected override void OnInsertComplete(int index, object value)
{
Customer c = (Customer)value;
c.Parent = this;
OnListChanged(new ListChangedEventArgs(ListChangedType.ItemAdded, index));
}

protected override void OnRemoveComplete(int index, object value)
{
Customer c = (Customer)value;
c.Parent = this;
OnListChanged(new ListChangedEventArgs(ListChangedType.ItemDeleted, index));
}

protected override void OnSetComplete(int index, object oldValue, object
newValue)
{
if (oldValue != newValue)
{

Customer oldcust = (Customer)oldValue;
Customer newcust = (Customer)newValue;

oldcust.Parent = null;
newcust.Parent = this;
OnListChanged(new ListChangedEventArgs(ListChangedType.ItemAdded, index));
}
}

// Called by Customer when it changes.
internal void CustomerChanged(Customer cust)
{

int index = List.IndexOf(cust);

OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, index));
}
// Implements IBindingList.
bool IBindingList.AllowEdit
{
get { return true ; }
}

bool IBindingList.AllowNew
{
get { return true ; }
}

bool IBindingList.AllowRemove
{
get { return true ; }
}

bool IBindingList.SupportsChangeNotification
{
get { return true ; }
}

bool IBindingList.SupportsSearching
{
get { return false ; }
}

bool IBindingList.SupportsSorting
{
get { return false ; }
}
// Events.
public event ListChangedEventHandler ListChanged
{
add
{
onListChanged += value;
}
remove
{
onListChanged -= value;
}
}

// Methods.
object IBindingList.AddNew()
{
Customer c = new Customer(this.Count.ToString());
List.Add(c);
return c;
}
// Unsupported properties.
bool IBindingList.IsSorted
{
get { throw new NotSupportedException(); }
}

ListSortDirection IBindingList.SortDirection
{
get { throw new NotSupportedException(); }
}
PropertyDescriptor IBindingList.SortProperty
{
get { throw new NotSupportedException(); }
}
// Unsupported Methods.
void IBindingList.AddIndex(PropertyDescriptor property)
{
throw new NotSupportedException();
}

void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection
direction)
{
throw new NotSupportedException();
}

int IBindingList.Find(PropertyDescriptor property, object key)
{
throw new NotSupportedException();
}

void IBindingList.RemoveIndex(PropertyDescriptor property)
{
throw new NotSupportedException();
}

void IBindingList.RemoveSort()
{
throw new NotSupportedException();
}

// Worker functions to populate the list with data.
private static Customer ReadCustomer1()
{
Customer cust = new Customer("536-45-1245");
cust.FirstName = "Jo";
cust.LastName = "Brown";
return cust;
}

private static Customer ReadCustomer2()
{
Customer cust = new Customer("246-12-5645");
cust.FirstName = "Robert";
cust.LastName = "Brown";
return cust;
}
}

Nov 17 '05 #1
Share this question for a faster answer!
Share on Google+

This discussion thread is closed

Replies have been disabled for this discussion.