ComboBox not dropping down

  • Thread starter Thread starter Colin Young
  • Start date Start date
C

Colin Young

I have a comboBox bound to a custom collection. The selected value appears
properly when the underlying data changes, the cursor keys cycle through the
records available in the collection, but when I click on the drop-down
arrow, nothing happens. Any suggestions?

Thanks.

Colin

quarterbackComboBox.DataBindings.Clear();
quarterbackComboBox.DataSource = qbList;
quarterbackComboBox.ValueMember = "SalespersonId";
quarterbackComboBox.DisplayMember = "LastName";
QuarterbackComboBox.DataBindings.Add(new Binding("SelectedValue",
dataObject, selectedValue));
 
Hi Colin,

What do you mean "nothing happens", the dropdownlist doesn't appear or the
dropdown list is empty?


If it is the latter issue, here are some suggestions to assist you
narrowing down the problem:
1. Did you file the data after binding the member to the collection object?
Will it show the data if you fill the collection object before binding?
If it helps, you need check if your collection class implemented the
IBIndingList interface correctly(espectially if you fired the ListChanged
event when there is a change to the collection. You may find a sample for
IBindingList implementation in MSDN Library <IBindingList Interface> to see
if the comboBox works weel with that collection class.
(unfortunately, the code snippet is not available in online MSDN
documentation)

2.If the problem still persists when binding to that collection class in
the MSDN sample, you may try setting a breakpoint in the getter method of
the property on the business object (e.g. Customer.FirstName) to see if
this property is actually accessed. if the breakpoint is hit, then you may
check if the value returned is correct (generally it is a string).

If you still have problem on it, you may seperate this problem in a small
project and send me to take a look at it.

Best regards,

Ying-Shen Yu [MSFT]
Microsoft community Support
Get Secure! - www.microsoft.com/security

This posting is provided "AS IS" with no warranties and confers no rights.
This mail should not be replied directly, please remove the word "online"
before sending mail.
 
I mean the dropdown list doesn't appear. Like I said, I can still use the
cursor keys to scroll up and down through the list.

Colin
 
Hi Colin,

Thanks for your reply,
How about binding the ComboBox to the sample code in the IBIndingList
inteface( I pasted the sample code in the end of this message in case you
didn't find it).
If the ComboBox could work with the sample code, the probably there is some
thing incorrect in your code of collection class/ business object.
could you send the code of collection class and the business object to me
to let me take a look at it?

If the ComboBox could not work with the sample code, then the problem might
on the ComboBox side, please sent the test project which can reproduce
this problem to me.
Thanks!
<code>
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;
}
}
public class Customer : IEditableObject
{

struct CustomerData
{
internal string id ;
internal string firstName ;
internal string lastName ;
}

private CustomersList parent;
private CustomerData custData;
private CustomerData backupData;
private bool inTxn = false;

// Implements IEditableObject
void IEditableObject.BeginEdit()
{
Console.WriteLine("Start BeginEdit");
if (!inTxn)
{
this.backupData = custData;
inTxn = true;
Console.WriteLine("BeginEdit - " + this.backupData.lastName);
}
Console.WriteLine("End BeginEdit");
}

void IEditableObject.CancelEdit()
{
Console.WriteLine("Start CancelEdit");
if (inTxn)
{
this.custData = backupData;
inTxn = false;
Console.WriteLine("CancelEdit - " + this.custData.lastName);
}
Console.WriteLine("End CancelEdit");
}

void IEditableObject.EndEdit()
{
Console.WriteLine("Start EndEdit" + this.custData.id +
this.custData.lastName);
if (inTxn)
{
backupData = new CustomerData();
inTxn = false;
Console.WriteLine("Done EndEdit - " + this.custData.id +
this.custData.lastName);
}
Console.WriteLine("End EndEdit");
}

public Customer(string ID) : base()
{
this.custData = new CustomerData();
this.custData.id = ID;
this.custData.firstName = "";
this.custData.lastName = "";
}

public string ID
{
get
{
return this.custData.id;
}
}

public string FirstName
{
get
{
return this.custData.firstName;
}
set
{
this.custData.firstName = value;
}
}

public string LastName
{
get
{
return this.custData.lastName;
}
set
{
this.custData.lastName = value;
}
}

internal CustomersList Parent
{
get
{
return parent;
}
set
{
parent = value ;
}
}

private void OnCustomerChanged()
{
if (!inTxn && Parent != null)
{
Parent.CustomerChanged(this);
}
}
}
</code>

Best regards,

Ying-Shen Yu [MSFT]
Microsoft community Support
Get Secure! - www.microsoft.com/security

This posting is provided "AS IS" with no warranties and confers no rights.
This mail should not be replied directly, please remove the word "online"
before sending mail.
 
I got sidetracked by some other coding issues so I haven't had a chance to
look into it, but when I was showing a colleague the problem a couple
minutes ago, we noticed that if I use the mouse wheel to scroll after
clicking the drop-down arrow, the scroll bar appears, and if I click in the
areas where the scroll arrows should be, the list scrolls (at least the
scroll bar is moving) and clicking on the invisible items in the list does
make a selection). I'll look into it more closely over the weekend or on
Monday morning, but I'm begining to wonder if some of the third-party
controls I'm using on the form aren't interfering with it.

Colin

"Ying-Shen Yu[MSFT]" said:
Hi Colin,

Thanks for your reply,
How about binding the ComboBox to the sample code in the IBIndingList
inteface( I pasted the sample code in the end of this message in case you
didn't find it).
If the ComboBox could work with the sample code, the probably there is some
thing incorrect in your code of collection class/ business object.
could you send the code of collection class and the business object to me
to let me take a look at it?

If the ComboBox could not work with the sample code, then the problem might
on the ComboBox side, please sent the test project which can reproduce
this problem to me.
Thanks!
<code>
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;
}
}
public class Customer : IEditableObject
{

struct CustomerData
{
internal string id ;
internal string firstName ;
internal string lastName ;
}

private CustomersList parent;
private CustomerData custData;
private CustomerData backupData;
private bool inTxn = false;

// Implements IEditableObject
void IEditableObject.BeginEdit()
{
Console.WriteLine("Start BeginEdit");
if (!inTxn)
{
this.backupData = custData;
inTxn = true;
Console.WriteLine("BeginEdit - " + this.backupData.lastName);
}
Console.WriteLine("End BeginEdit");
}

void IEditableObject.CancelEdit()
{
Console.WriteLine("Start CancelEdit");
if (inTxn)
{
this.custData = backupData;
inTxn = false;
Console.WriteLine("CancelEdit - " + this.custData.lastName);
}
Console.WriteLine("End CancelEdit");
}

void IEditableObject.EndEdit()
{
Console.WriteLine("Start EndEdit" + this.custData.id +
this.custData.lastName);
if (inTxn)
{
backupData = new CustomerData();
inTxn = false;
Console.WriteLine("Done EndEdit - " + this.custData.id +
this.custData.lastName);
}
Console.WriteLine("End EndEdit");
}

public Customer(string ID) : base()
{
this.custData = new CustomerData();
this.custData.id = ID;
this.custData.firstName = "";
this.custData.lastName = "";
}

public string ID
{
get
{
return this.custData.id;
}
}

public string FirstName
{
get
{
return this.custData.firstName;
}
set
{
this.custData.firstName = value;
}
}

public string LastName
{
get
{
return this.custData.lastName;
}
set
{
this.custData.lastName = value;
}
}

internal CustomersList Parent
{
get
{
return parent;
}
set
{
parent = value ;
}
}

private void OnCustomerChanged()
{
if (!inTxn && Parent != null)
{
Parent.CustomerChanged(this);
}
}
}
</code>

Best regards,

Ying-Shen Yu [MSFT]
Microsoft community Support
Get Secure! - www.microsoft.com/security

This posting is provided "AS IS" with no warranties and confers no rights.
This mail should not be replied directly, please remove the word "online"
before sending mail.
 
I tried using an ArrayList as the datasource of the combobox control and got
the same results. I tried to reproduce the problem in a new project, but it
worked there. I think it has something to do with the other controls on my
form somehow interfering with the combobox. I was hoping that there was
something simple I had done but it looks like I'm going to need to go
through the form one control at a time to see which one is breaking things.

Thanks.

Colin

"Ying-Shen Yu[MSFT]" said:
Hi Colin,

Thanks for your reply,
How about binding the ComboBox to the sample code in the IBIndingList
inteface( I pasted the sample code in the end of this message in case you
didn't find it).
If the ComboBox could work with the sample code, the probably there is some
thing incorrect in your code of collection class/ business object.
could you send the code of collection class and the business object to me
to let me take a look at it?

If the ComboBox could not work with the sample code, then the problem might
on the ComboBox side, please sent the test project which can reproduce
this problem to me.
Thanks!
<code>
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;
}
}
public class Customer : IEditableObject
{

struct CustomerData
{
internal string id ;
internal string firstName ;
internal string lastName ;
}

private CustomersList parent;
private CustomerData custData;
private CustomerData backupData;
private bool inTxn = false;

// Implements IEditableObject
void IEditableObject.BeginEdit()
{
Console.WriteLine("Start BeginEdit");
if (!inTxn)
{
this.backupData = custData;
inTxn = true;
Console.WriteLine("BeginEdit - " + this.backupData.lastName);
}
Console.WriteLine("End BeginEdit");
}

void IEditableObject.CancelEdit()
{
Console.WriteLine("Start CancelEdit");
if (inTxn)
{
this.custData = backupData;
inTxn = false;
Console.WriteLine("CancelEdit - " + this.custData.lastName);
}
Console.WriteLine("End CancelEdit");
}

void IEditableObject.EndEdit()
{
Console.WriteLine("Start EndEdit" + this.custData.id +
this.custData.lastName);
if (inTxn)
{
backupData = new CustomerData();
inTxn = false;
Console.WriteLine("Done EndEdit - " + this.custData.id +
this.custData.lastName);
}
Console.WriteLine("End EndEdit");
}

public Customer(string ID) : base()
{
this.custData = new CustomerData();
this.custData.id = ID;
this.custData.firstName = "";
this.custData.lastName = "";
}

public string ID
{
get
{
return this.custData.id;
}
}

public string FirstName
{
get
{
return this.custData.firstName;
}
set
{
this.custData.firstName = value;
}
}

public string LastName
{
get
{
return this.custData.lastName;
}
set
{
this.custData.lastName = value;
}
}

internal CustomersList Parent
{
get
{
return parent;
}
set
{
parent = value ;
}
}

private void OnCustomerChanged()
{
if (!inTxn && Parent != null)
{
Parent.CustomerChanged(this);
}
}
}
</code>

Best regards,

Ying-Shen Yu [MSFT]
Microsoft community Support
Get Secure! - www.microsoft.com/security

This posting is provided "AS IS" with no warranties and confers no rights.
This mail should not be replied directly, please remove the word "online"
before sending mail.
 
Hi Colin,

I'll keep monitoring this thread for several days,
please feel free to update this thread or create a new thread if you need
help on this issue.

Have a good day!

Best regards,

Ying-Shen Yu [MSFT]
Microsoft community Support
Get Secure! - www.microsoft.com/security

This posting is provided "AS IS" with no warranties and confers no rights.
This mail should not be replied directly, please remove the word "online"
before sending mail.
 
Back
Top