How to create a Winforms Combobox with Label and Value?
I am mostly an ASP.NET developer but I am working on a WinForms app and noticed a large difference between the ASP.NET combobox (html select) and that of WinForms. I found (maybe incorrectly so) that WinForm's combobox only has a "label" whereas ASP.NET allows you to specify a "label" and a "value".
I am looking to use a WinForms combobox (or another comparable control) with a label and a value (Foobar / 42329). Is this possible? I have attempted to search for the answer but haven't come up with much. If there is no way to accomplish that, how does one go ahead and design a WinForm combobox that would represent say Cities with their associated database id?
- Toronto / 2324
- Montreal / 64547
- Vancouver / 1213
I can think of a few ways:
- override the
ToString()
of aCity
class toreturn Name + " / " + Id;
- ditto, but with a
TypeConverter
- add a
DisplayText
property that return the same, and useDisplayMember
- build a shim class for the data
For the last:
var data = cities.Select(city => new {
Id = city.Id, Text = city.Name + " / " + city.Id }).ToList();
cbo.ValueMember = "Id";
cbo.DisplayMember = "Text";
cbo.DataSource = data;
Assuming that your values are unique, you can first populate a dictionary then bind the combobox to the dictionary. Unfortunately databinding requires an IList or an IListSource so you have to wrap it in Binding Source. I found the solution here.
private void PopulateComboBox()
{
var dict = new Dictionary<int, string>();
dict.Add(2324, "Toronto");
dict.Add(64547, "Vancouver");
dict.Add(42329, "Foobar");
comboBox1.DataSource = new BindingSource(dict, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";
}