ComboBox.ValueMember and DisplayMember
Solution 1
You should not set datasource
of your listbox and/or combobox in this order
ComboBox1.DataSource = dataTable;
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
Instead, this is correct order:
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
ComboBox1.DataSource = dataTable;
NOTE: setting datasource
should be last line.
If you set datasource
first, SelectedIndexChanged
event will fire and you may get the cast error or other exception.
Solution 2
Using keyvalue pairs to populate a combobox
A neat way to populate combo boxes is to set the datasource to a list of keyvalue pairs. It may also inspire using data stored in a list of some kind:
//Some values to show in combobox
string[] ports= new string[3] {"COM1", "COM2", "COM3"};
//Set datasource to string array converted to list of keyvaluepairs
combobox.Datasource = ports.Select(p => new KeyValuePair<string, string>(p, p)).ToList();
//Configure the combo control
combobox.DisplayMember = "Key";
combobox.ValueMember = "Value";
combobox.SelectedValue = ports[0];
The datasource can be populated using this syntax as well:
ports.Select(p => new { Key = p, Value = p }).ToList();
The technicue may be expanded with more property names for multiple column lists.
Solution 3
ComboBox1.DataSource= dt; //the data table which contains data
ComboBox1.ValueMember = "id"; // column name which you want in SelectedValue
ComboBox1.DisplayMember = "name"; // column name that you need to display as text
Solution 4
I had the same trouble. In my case, SelectedIndexChanged event fires and just jumps out the method. Try do not use SelectedIndexChanged event. Or something like this:
ComboBox1.SelectedIndexChanged -= new System.EventHandler(ComboBox1_SelectedIndexChanged);
ComboBox1.DataSource = dataTable;
ComboBox1.ValueMember = "id";
ComboBox1.DisplayMember = "name";
ComboBox1.SelectedIndexChanged += new System.EventHandler(ComboBox1_SelectedIndexChanged);
It worked for me. =)
Solution 5
ComboBox1.ValueMember = dataTable.Columns["id"].ColumnsName; // column name which the values are not visible
ComboBox1.DisplayMember = dataTable.Columns ["name"].ColumnsName;
/*
column name that you need to select item by proprity :
ComboBox1.SelectedItem;
Or you can use easly this :
ComboBox1.Text;
*/
ComboBox1.DataSource= dataTable; //the data table which contains data
// and this should be last :)
dbncourt
Updated on January 20, 2020Comments
-
dbncourt over 4 years
How do i set this values? I have a DataTable with all the data i want to set in the combobox, but i cant find how to set it.
I tried
ComboBox1.DataSource = dataTable; ComboBox1.ValueMember = "id"; // --> once hes here, he just jumps out the method ComboBox1.DisplayMember = "name";
No compilation error, warning, nothing.. just jumps out!
This is the query to fill the DataTable
"Select * from \"Table\""
I checked with the debugger and the datatable was filled. The columns names are "id" and "name". ComboBox is blank. I'm filling it for the first time!
-
dbncourt about 12 yearsmmm, nop! it doesnt work. U see, dataTable has values in it cuz i checked with the debbuger, those columns names are exactly id and name. if i put it like u did, the id is listed in the combobox, for some reason idk cuz names have names in it. And It never reach the displaymamber line.
-
dbncourt about 12 yearsI think dataTable is not a valid source, i saw it with DataSource, but i dont have that :/, maybe i can parse the DataTable into a DataSource?
-
dbncourt about 12 yearsComboBox1.DataBind(); this doesnt exist. At least not in my version (visual studio 2010) ComboBox.DataBindings. and is not a method.
-
PraveenVenu about 12 yearsDataBind() is for Web applications only; if it is a windows application that line is not needed
-
AbcAeffchen over 9 yearsYour answer should contain an explanation of your code and a description how it solves the problem.
-
John about 9 yearsDoesn't make sense; if you don't give the combobox the datasource first, how would it know what should be the
ValueMember
and what should be theDisplayMember
if it doesn't have the data in the first place. That's a counter-intuitive practice. -
DrewJordan almost 9 years@John you're right, it is counter-intuitive, but it works. Do a search for combobox datarowview and you'll see others who've had the same problem.
-
T.S. almost 8 years@John If you look how it works internally, you would understand that setting Datasource last is essential for performance. Because setting
ValueMember
triggers no action. If you set Datasource first, cbo will bind value member for you. Then, you're going to set new ValueMember [the one you want] and cbo will have to re-wire binding. So, if you set DS last, bindings will happen only once. -
Hasnain over 4 yearsIt worked for me ! Thank You. Can you please tell me more about .ColumnsName property and datatable.Columns
-
HackSlash almost 4 yearsThat is a dangerous hack. You could use a
Try
...Finally
block to ensure that the event always gets turned back on. You could also set the DataSource last like the other answers. -
Marcelo Scofano Diniz almost 3 yearsThis should be the answer; it functions perfectly with Enums as DataSource:
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().Select(e => new { Key = e, Value = e }).ToList();