Generics SortedList and DataSource

G

Guest

Here is an example of a SortedList that works as a datasource to the ComboBox
and a generic SortedList<> that does not works as a datasource to the
ComboBox.

Why? If I use List and generic List<>, both works.

private void Form1_Load(object sender, EventArgs e)
{
System.Collections.SortedList QA1 = new
System.Collections.SortedList();
QA1["Name1"] = new Query("Name1", "Group1", true);
QA1["Name2"] = new Query("Name2", "Group1", true);
comboBox1.DataSource = QA1.Values; // Works !


System.Collections.Generic.SortedList<string, Query> QA2 = new
System.Collections.Generic.SortedList<string, Query>();
QA2["Name1"] = new Query("Name1", "Group1", true);
QA2["Name2"] = new Query("Name2", "Group1", true);
comboBox1.DataSource = QA2.Values; // Does not works
}



Here's the QUERY.cls code in case you're wondering:

sing System;

namespace WindowsApplication1
{
/// <summary>
/// Summary description for Query.
/// </summary>
public class Query : IComparable
{
string m_name ;
string m_group;
string m_email;
bool m_IsDirect;


public Query(string Name , string Group, bool IsDirect )
{
m_name = Name;
m_group = Group;
m_IsDirect = IsDirect;
m_email = "";
}

public Query(string Name , string Group, bool IsDirect, string Email)
{
m_name = Name;
m_group = Group;
m_email = Email;
m_IsDirect = IsDirect;
}

public string Email
{
get
{
return m_email;
}
set
{
m_email = value;
}
}

public bool IsDirect
{
get
{
return m_IsDirect;
}
set
{
m_IsDirect = value;
}
}

public string Name
{
get
{
return m_name;
}
set
{
m_name = value;
}
}

public string Group
{
get
{
return m_group;
}
set
{
m_group = value;
}
}

public string Display
{
get
{
return string.Format("{0}{1}\t{2}",m_IsDirect ? " \t" : "\x2206\t",
m_group, m_name);
}
}
public string DisplayALL
{
get
{
return string.Format("{0}\t{1}\t{2}",m_group, m_name, m_email);
}
}

#region IComparable Members
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
// int IComparer.Compare( Object one, Object two ) {
// return( (new CaseInsensitiveComparer()).Compare( y, x ) );
// }

public int CompareTo(object obj)
{
if(obj is Query)
{
Query item = (Query) obj;
return m_name.CompareTo(item.m_name);
}
throw new ArgumentException("This object is not a Query Class");
}

#endregion
}
}
 
G

Guest

by the way, the error is

"Complex DataBinding accepts as a data source either an IList or an
IListSource."
 
N

Nicholas Paldino [.NET/C# MVP]

SHEBERT,

It's exactly what the error says. The DataSource needs to implement
IList or IListSource. The SortedList<TKey, TValue> class does not implement
IList or IListSource interface, so it can't be used for the DataSource
property on the ComboBox.

Hope this helps.


--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)

SHEBERT said:
by the way, the error is

"Complex DataBinding accepts as a data source either an IList or an
IListSource."



SHEBERT said:
Here is an example of a SortedList that works as a datasource to the
ComboBox
and a generic SortedList<> that does not works as a datasource to the
ComboBox.

Why? If I use List and generic List<>, both works.

private void Form1_Load(object sender, EventArgs e)
{
System.Collections.SortedList QA1 = new
System.Collections.SortedList();
QA1["Name1"] = new Query("Name1", "Group1", true);
QA1["Name2"] = new Query("Name2", "Group1", true);
comboBox1.DataSource = QA1.Values; // Works !


System.Collections.Generic.SortedList<string, Query> QA2 =
new
System.Collections.Generic.SortedList<string, Query>();
QA2["Name1"] = new Query("Name1", "Group1", true);
QA2["Name2"] = new Query("Name2", "Group1", true);
comboBox1.DataSource = QA2.Values; // Does not works
}



Here's the QUERY.cls code in case you're wondering:

sing System;

namespace WindowsApplication1
{
/// <summary>
/// Summary description for Query.
/// </summary>
public class Query : IComparable
{
string m_name ;
string m_group;
string m_email;
bool m_IsDirect;


public Query(string Name , string Group, bool IsDirect )
{
m_name = Name;
m_group = Group;
m_IsDirect = IsDirect;
m_email = "";
}

public Query(string Name , string Group, bool IsDirect, string Email)
{
m_name = Name;
m_group = Group;
m_email = Email;
m_IsDirect = IsDirect;
}

public string Email
{
get
{
return m_email;
}
set
{
m_email = value;
}
}

public bool IsDirect
{
get
{
return m_IsDirect;
}
set
{
m_IsDirect = value;
}
}

public string Name
{
get
{
return m_name;
}
set
{
m_name = value;
}
}

public string Group
{
get
{
return m_group;
}
set
{
m_group = value;
}
}

public string Display
{
get
{
return string.Format("{0}{1}\t{2}",m_IsDirect ? " \t" : "\x2206\t",
m_group, m_name);
}
}
public string DisplayALL
{
get
{
return string.Format("{0}\t{1}\t{2}",m_group, m_name, m_email);
}
}

#region IComparable Members
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
// int IComparer.Compare( Object one, Object two ) {
// return( (new CaseInsensitiveComparer()).Compare( y, x ) );
// }

public int CompareTo(object obj)
{
if(obj is Query)
{
Query item = (Query) obj;
return m_name.CompareTo(item.m_name);
}
throw new ArgumentException("This object is not a Query Class");
}

#endregion
}
}
 
G

Guest

The LIST object works, either LIST or generics LIST<> works ! Even if LIST<>
is generics it does work as a COMBOXBOX datasource.

then why SortedList implements ILIST (since it's working as a COMBOBOX
DataSource) and not generics SortedList <>?

what's the difference between SORTEDLIST and Generics SORTEDLIST<> that it
won't works?



Nicholas Paldino said:
SHEBERT,

It's exactly what the error says. The DataSource needs to implement
IList or IListSource. The SortedList<TKey, TValue> class does not implement
IList or IListSource interface, so it can't be used for the DataSource
property on the ComboBox.

Hope this helps.


--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)

SHEBERT said:
by the way, the error is

"Complex DataBinding accepts as a data source either an IList or an
IListSource."



SHEBERT said:
Here is an example of a SortedList that works as a datasource to the
ComboBox
and a generic SortedList<> that does not works as a datasource to the
ComboBox.

Why? If I use List and generic List<>, both works.

private void Form1_Load(object sender, EventArgs e)
{
System.Collections.SortedList QA1 = new
System.Collections.SortedList();
QA1["Name1"] = new Query("Name1", "Group1", true);
QA1["Name2"] = new Query("Name2", "Group1", true);
comboBox1.DataSource = QA1.Values; // Works !


System.Collections.Generic.SortedList<string, Query> QA2 =
new
System.Collections.Generic.SortedList<string, Query>();
QA2["Name1"] = new Query("Name1", "Group1", true);
QA2["Name2"] = new Query("Name2", "Group1", true);
comboBox1.DataSource = QA2.Values; // Does not works
}



Here's the QUERY.cls code in case you're wondering:

sing System;

namespace WindowsApplication1
{
/// <summary>
/// Summary description for Query.
/// </summary>
public class Query : IComparable
{
string m_name ;
string m_group;
string m_email;
bool m_IsDirect;


public Query(string Name , string Group, bool IsDirect )
{
m_name = Name;
m_group = Group;
m_IsDirect = IsDirect;
m_email = "";
}

public Query(string Name , string Group, bool IsDirect, string Email)
{
m_name = Name;
m_group = Group;
m_email = Email;
m_IsDirect = IsDirect;
}

public string Email
{
get
{
return m_email;
}
set
{
m_email = value;
}
}

public bool IsDirect
{
get
{
return m_IsDirect;
}
set
{
m_IsDirect = value;
}
}

public string Name
{
get
{
return m_name;
}
set
{
m_name = value;
}
}

public string Group
{
get
{
return m_group;
}
set
{
m_group = value;
}
}

public string Display
{
get
{
return string.Format("{0}{1}\t{2}",m_IsDirect ? " \t" : "\x2206\t",
m_group, m_name);
}
}
public string DisplayALL
{
get
{
return string.Format("{0}\t{1}\t{2}",m_group, m_name, m_email);
}
}

#region IComparable Members
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
// int IComparer.Compare( Object one, Object two ) {
// return( (new CaseInsensitiveComparer()).Compare( y, x ) );
// }

public int CompareTo(object obj)
{
if(obj is Query)
{
Query item = (Query) obj;
return m_name.CompareTo(item.m_name);
}
throw new ArgumentException("This object is not a Query Class");
}

#endregion
}
}
 
C

Claes Bergefall

You're binding to the object returned from the Values property, so let's
examine what you really get using reflector

The System.Collections.SortedList.Values property is typed as returning
ICollection, so in theory you should not be able to bind to this. However,
what it really returns is an instance of the private type
System.Collections.SortedList.Values. This class implements both IList and
ICollection, so binding works anyway (but this might very well change in the
future)

The System.Collections.Generic.SortedList(TKey, TValue).Values is typed as
returning IList<TValue>, so you should not be able to bind to this. But in
reality (just as for SortedList.Values above) it returns an instance of the
private type System.Collections.Generic.SortedList(TKey,
TValue).ValueList<TKey, TValue. Problem is this list doesn't implement IList
so it cannot be used for databinding

The generic List implements IList so it's perfectly valid as a binding
source

/claes

SHEBERT said:
The LIST object works, either LIST or generics LIST<> works ! Even if
LIST<>
is generics it does work as a COMBOXBOX datasource.

then why SortedList implements ILIST (since it's working as a COMBOBOX
DataSource) and not generics SortedList <>?

what's the difference between SORTEDLIST and Generics SORTEDLIST<> that it
won't works?



Nicholas Paldino said:
SHEBERT,

It's exactly what the error says. The DataSource needs to implement
IList or IListSource. The SortedList<TKey, TValue> class does not
implement
IList or IListSource interface, so it can't be used for the DataSource
property on the ComboBox.

Hope this helps.


--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)

SHEBERT said:
by the way, the error is

"Complex DataBinding accepts as a data source either an IList or an
IListSource."



:

Here is an example of a SortedList that works as a datasource to the
ComboBox
and a generic SortedList<> that does not works as a datasource to the
ComboBox.

Why? If I use List and generic List<>, both works.

private void Form1_Load(object sender, EventArgs e)
{
System.Collections.SortedList QA1 = new
System.Collections.SortedList();
QA1["Name1"] = new Query("Name1", "Group1", true);
QA1["Name2"] = new Query("Name2", "Group1", true);
comboBox1.DataSource = QA1.Values; // Works !


System.Collections.Generic.SortedList<string, Query> QA2 =
new
System.Collections.Generic.SortedList<string, Query>();
QA2["Name1"] = new Query("Name1", "Group1", true);
QA2["Name2"] = new Query("Name2", "Group1", true);
comboBox1.DataSource = QA2.Values; // Does not works
}



Here's the QUERY.cls code in case you're wondering:

sing System;

namespace WindowsApplication1
{
/// <summary>
/// Summary description for Query.
/// </summary>
public class Query : IComparable
{
string m_name ;
string m_group;
string m_email;
bool m_IsDirect;


public Query(string Name , string Group, bool IsDirect )
{
m_name = Name;
m_group = Group;
m_IsDirect = IsDirect;
m_email = "";
}

public Query(string Name , string Group, bool IsDirect, string Email)
{
m_name = Name;
m_group = Group;
m_email = Email;
m_IsDirect = IsDirect;
}

public string Email
{
get
{
return m_email;
}
set
{
m_email = value;
}
}

public bool IsDirect
{
get
{
return m_IsDirect;
}
set
{
m_IsDirect = value;
}
}

public string Name
{
get
{
return m_name;
}
set
{
m_name = value;
}
}

public string Group
{
get
{
return m_group;
}
set
{
m_group = value;
}
}

public string Display
{
get
{
return string.Format("{0}{1}\t{2}",m_IsDirect ? " \t" : "\x2206\t",
m_group, m_name);
}
}
public string DisplayALL
{
get
{
return string.Format("{0}\t{1}\t{2}",m_group, m_name, m_email);
}
}

#region IComparable Members
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
// int IComparer.Compare( Object one, Object two ) {
// return( (new CaseInsensitiveComparer()).Compare( y, x ) );
// }

public int CompareTo(object obj)
{
if(obj is Query)
{
Query item = (Query) obj;
return m_name.CompareTo(item.m_name);
}
throw new ArgumentException("This object is not a Query Class");
}

#endregion
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top